gpt4 book ai didi

javascript - 选择 :target on document. 就绪()

转载 作者:行者123 更新时间:2023-11-29 14:55:39 29 4
gpt4 key购买 nike

下面是一个简单的测试用例来演示我正在尝试做的事情:

<html>
<head>
<title>Test</title>
</head>
<body>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
$(":target").css('color', 'red');
});
</script>
<ul>
<li id="one">One</li>
<li id="two">Two</li>
<li id="three">Three</li>
</ul>
</body>
</html>

这个想法是通过 jQuery/Javascript 对目标项目做一些事情,当有目标时(例如,test.html#two)。

这在 Firefox 和 IE 10 中按我预期的方式工作,但在 Chrome、Opera 或 Safari 中却不行,这让我想知道这是否是某些浏览器中的错误,如果我尝试做的是某种错误,或者如果我与某些规范或其他规范中不够精确的部分发生冲突。

如果我改变 jQuery 代码来做

alert($(":target").length);

很明显,Chrome、Opera 和 Safari 在 document.ready() 期间无法找到 :target 元素,但稍后调用相同的代码(通过控制台或附加到单击事件的函数)确实找到了元素。

什么时候 :target 可以被 JS 访问?

最佳答案

这是作为评论发布的,但后来被删除了,您可以尝试等待窗口加载事件:

$(window).on('load hashchange', function(){
$(':target').css('color', 'red');
});

这对我来说在 Chrome 上产生了不同的结果,它在刷新页面 (F5) 时有效,但在地址栏中按 Enter 时无效。

我不知道是否有任何方法可以使用 :target 选择器在页面加载时正确处理此问题,但您始终可以获取哈希值并将其用作您的选择器:

$(window).on('load hashchange', function(){
var target = window.location.hash;
$(target).css('color', 'red');
});

更新

我一直在对这个问题进行一些研究和一些测试,我有一些见解可以分享:

首先,我们需要了解当调用 $(':target') 时,jQuery 在内部使用了 querySelectorAll(':target'),这意味着它直接与伪类的 CSS 规范相关,但为什么在 document.ready() 中不起作用?

好吧,我发现将代码包装在 setTimeout(fn,0) 中实际上使选择器可用:

$(document).ready(function(){
setTimeout(function(){
$(':target').css('color', 'red'); //THIS WORKS
},0);
});

您可以阅读 this answer有关添加零毫秒超时实际上如何产生影响的解释,但基本上它允许浏览器完成其他非 javascript 相关任务(我们会发现使实际的 CSS 伪类可用于查询)。我相信 Firefox 以某种方式以不同方式管理其内部流程,这就是为什么代码可以在那里工作而无需超时的原因。

现在我还发现 jQuery 的内部 sizzle 选择器引擎为不支持 CSS :target 伪类的浏览器提供了回退,你可以在 document.ready() 没有问题:

$(document).ready(function(){
$(':target()').css('color', 'red');
});

之所以可行,是因为它不是依赖于 CSS 类,而是利用 window.location 对象上的 hash 属性的 javascript 实现,其内部定义如下:

"target": function( elem ) {
var hash = window.location && window.location.hash;
return hash && hash.slice( 1 ) === elem.id;
}

你唯一应该注意的是,如果没有传递像 :target(div) 这样的选择器,这个函数将遍历页面上的每个元素,所以我相信使用我之前提供的解决方法仍然是比这更好的选择。

关于javascript - 选择 :target on document. 就绪(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18371439/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com