Javascript querySelectorAll()在Opera Mobile 11.5中不工作?

Javascript querySelectorAll()在Opera Mobile 11.5中不工作?,javascript,opera,userscripts,opera-mobile,selectors-api,Javascript,Opera,Userscripts,Opera Mobile,Selectors Api,我试图使用querySelectorAll从网页中删除不必要的元素,但这在Opera Mobile 11.5上似乎不起作用。在我把脚本放到手机上之前,我已经在我的电脑上试过了 Mozilla的文档令人困惑,因为关于这个函数有两页,一页和另一页 有解决办法吗?我需要在我制作的脚本中实现其他库吗 我想这样做: function deleteByCSS(el) { elem = document.body.querySelectorAll(el); for (i=0; i<elem.leng

我试图使用
querySelectorAll
从网页中删除不必要的元素,但这在Opera Mobile 11.5上似乎不起作用。在我把脚本放到手机上之前,我已经在我的电脑上试过了

Mozilla的文档令人困惑,因为关于这个函数有两页,一页和另一页

有解决办法吗?我需要在我制作的脚本中实现其他库吗

我想这样做:

function deleteByCSS(el) {
 elem = document.body.querySelectorAll(el);
 for (i=0; i<elem.length; i++){
  elem[i].parentNode.removeChild(elem[i]);
 }
}
deleteByCSS("here goes every CSS selector pointing to objects I want to remove");
函数deleteByCSS(el){
elem=document.body.queryselectoral(el);
对于(i=0;i根据caniuse(),它应该由opera mini支持


无论如何,如果你想避免这种问题,或者仅仅是sizzle,请使用Zepto或jQuery进行css dom选择。querySelectorAll和querySelector显然不受所有浏览器、桌面或移动设备的支持。我认为Mozilla的dom api参考不是很好,也不是最新的。开发人员确实需要一个真正完整和深入的domapi文档。

问题很可能是您在迭代时正在从列表中删除元素。安全的替代方法是向后循环,这样,删除节点不会影响列表的其余部分

function deleteByCSS(el) {
  var elem = document.body.querySelectorAll(el);
  for (var i=elem.length - 1; i>=0; i--){
    elem[i].parentNode.removeChild(elem[i]);
  }
}
顺便说一句,不要忘记在局部变量之前添加
var
,几个问题:

  • 在删除顺序上是正确的。如果不反向删除,不仅JS效率低下,而且由于数组值不再有效,脚本很有可能会崩溃。如果效率低下的方法出现一两次,那就是运气

  • 此外,需要考虑嵌套节点,请注意下面代码中的额外检查

  • 事实上,代码似乎在外部为您工作,这表明您正在使用的节点是通过页面javascript/AJAX添加的。请使用计时器或类似方法进行补偿

  • 如果仍然遇到困难,链接到目标页面发布您正在尝试的确切CSS选择器

  • 请注意,这两个页面要么这样说,要么显示一个问号——这并不意味着它不兼容,只是Mozilla没有测试它(其他人测试过)。请注意,
    document.querySelectorAll()
    {element}.querySelectorAll()
    ,这两个页面之间可能存在差异

  • 总而言之,这样的代码应该可以工作:

    function deleteByCSS (cssSelector, delayLoopMax, delayMilliSecs) {
        //-- Use defaults, if not specified.
        var delayLoopMax    = delayLoopMax   || 0;
        var delayMilliSecs  = delayMilliSecs || 300;
        //console.log ("Args: ", cssSelector, delayLoopMax, delayMilliSecs);
    
        var doomedElements  = document.body.querySelectorAll (cssSelector);
        if (doomedElements  &&  doomedElements.length) {
            //console.log ("Found!");
            //-- Found the node(s); delete it/them.
            for (var J = doomedElements.length - 1;  J >= 0;  --J) {
                var doomedNode  = doomedElements[J];
                if (doomedNode) {
                    doomedNode.parentNode.removeChild (doomedNode);
                }
            }
        }
        else {
            //-- Nodes not found. Wait for JS to add them, if specified.
            if (delayLoopMax > 0) {
                delayLoopMax--;
                setTimeout (
                    deleteByCSS,
                    delayMilliSecs,
                    cssSelector, delayLoopMax, delayMilliSecs
                );
            }
        }
    }
    

    在这种情况下,使用它的初始额外参数为20

    deleteByCSS ("*VALID* CSS selector", 20);
    

    我猜你想说的是移动版而不是迷你版。在我使用Sizzle之前,我尝试过使用Sizzle,但我不知道如何使用Sizzle获得相同的结果。github和zip包中的文档没有向我展示任何我可以学习其方法的示例。不,这是不行的rk或者,我认为在这种情况下向后循环是没有意义的,因为elem数组只填充了一次,所以我可以用我想用的任何方式遍历它。@user1263513:elem是一个节点列表,这意味着它是活动的。因此,从DOM中删除节点也会将它们从列表中删除。如果你想向前迭代并删除元素,你必须为了增加循环IndexTrange,我在我的PC上的Firefox上用复杂的CSS3选择器进行了尝试,结果收集了10多个元素,所有元素都被删除了,没有一个单独的标记error@JuanMendesquerySelectorAll的节点列表不是活动的,它是静态的。@KernelJames谢谢,我不知道节点列表不是活动的,但这是真的回答很好,但是这个函数也不起作用。我尝试用一个匿名函数包装它和调用,然后用window.opera.addEventListener再次包装它,并指定了AfterScript事件,但仍然没有销毁元素。其中一个网站是,CSS选择器是'div[style=“float:left;”]div[style=“margin left:5px;”]div[style=“float:right;”,div#addthis_按钮,div#uvTab,a[href*=“vdownloader.com]”,a[href*=“youtubedownloader.com”]”,这在桌面Firefox上非常有效。您最后一条评论中的代码是“混乱的”。请编辑问题以添加任何有意义的代码。不要在此处使用
    addEventListener
    AfterScript
    ,这就是计时器代码的用途。事实上,此特定代码在运行时可以很好地工作……最后,我不知道Opera Mobile是否支持一次完成多个选择器。请先尝试一些简单的方法,例如
    deleteByCSS(“#addthis_按钮”,20);
    。我没有看到任何iFrame,但如果其中一些节点在其中,请保持警惕。我现在已经尝试了UserJS和Greasemonkey模式下答案中提供的所有功能组合。我现在高度怀疑Opera Mobile是否真的支持querySelectorAll()。作为替代方案,您对此有何看法:正如您在演示中所看到的,它的功能与所讨论的函数完全相同。如果它可以工作,请尝试。非常确定
    querySelectorAll()
    仍然有效;当我感到兴奋时,会启动模拟器,并再次检查……首先尝试:将
    document.body.querySelectorAll
    替换为
    document.querySelectorAll
    ,然后尝试一个简单的选择器启动。好的,到目前为止,我唯一没有尝试过的是我在Greasemonkey模式下的原始代码段,它真正起作用ks。但是,当它运行时,我想避免下载的很多东西都已经下载了。这似乎是Opera Mobile的一个限制。我甚至用BeforeScript和AfterScript将它包装在window.Opera.AddEventListener中,但是变量元素只在Greasemonkey模式下填充。只是想知道,这些内容会被加载吗如果我使用UserJS插入一个css,将它们的display设置为none?