0

を使用して必須ではない要素をWebページから削除しようとしていますが、OperaMobile11.5ではquerySelectorAll機能しないようです。スクリプトを携帯電話に配置する前に、PCでスクリプトを試してみました。

この関数については2ページあり、1つは互換性があると述べており、もう1つは互換性がないと述べているため、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");
4

3 に答える 3

1

問題は、要素を反復処理しているときにリストから要素を削除している可能性が非常に高いです。安全な代替手段は、逆方向にループすることです。そうすれば、ノードを削除してもリストの残りの部分には影響しません。

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ローカル変数の前に追加することを忘れないでください

于 2012-03-12T23:07:45.627 に答える
1

いくつかの問題:

  1. 削除順序については、Juan Mendes の回答が正しいです。逆に削除しないと、JS が非効率になるだけでなく、無効な配列値が原因でスクリプトがクラッシュする可能性が高くなります。非効率的な方法が 1 回か 2 回機能するように見えた場合、それはただの運です。

  2. さらに、ネストされたノードを考慮に入れる必要があります。以下のコードの追加チェックに注意してください。

  3. コードがOpera の外で動作するように見えるという事実、User JavaScriptは、使用しているノードがページ javascript/AJAX によって追加されたことを示唆しています。タイマーなどで補正してください。

  4. それでも問題が発生する場合は、ターゲット ページにリンクし、試行している正確な CSS セレクターを投稿してください。

  5. querySelectorAll()は Opera Mobile 11.5 と互換性があり、これらのページの両方にそう表示されているか、疑問符が表示されていることに注意してください。これは、互換性がないという意味ではなく、Mozilla がテストしていない (他の人が持っている) だけです。と の間には違いがある可能性があるため、2 つのページがあることに注意してください。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);
于 2012-03-13T05:23:32.827 に答える
0

caniuse( http://caniuse.com/#search=queryselector )によると、operaminiでサポートされているはずです。

とにかく、そのような問題を回避したい場合、または単にシズルしたい場合は、cssdomの選択にZeptoまたはjQueryを使用してください。querySelectorAllとquerySelectorは、デスクトップまたはモバイルのすべてのブラウザでサポートされているわけではありません。私の意見では、MozillaのDOMapiのリファレンスはあまり良くないか最新ではありません。開発者は、真に完全で詳細なDOMAPIドキュメントを本当に必要としています。

于 2012-03-12T23:03:41.153 に答える