0

私は数時間、単純な問題と思われるものに苦労してきました。機能する REGEX 式を作成しましたが、HTML を処理するためのよりエレガントなアプローチを望んでいました。ページでコンテンツを直接処理するのではなく、文字列が関数に渡されます。多くの例を見た後、何か間違ったことをしているに違いないと感じました。文字列を取得して、データベースに保存する前にクライアント イベントを消去しようとしています。これには jQuery が最適だと思いました。

私が欲しい:

Some random text <a href="http://stackoverflow.com" onclick="return evilScripts();">click here</a> and a link with any event type
//to become:
Some random text <a href="http://stackoverflow.com">click here</a> and a link with any event type

これが私のコードです

function RemoveEvilScripts(){
    var myDiv = $('<div>').html('testing this <a href="#Foo" onclick="return runMyFunction();">Do it!</a> out');
    //remove all the different types of events
    $(myDiv).find('a').unbind();            
    return $(myDiv).html();
}

私の結果は、 onClick がアンカータグに残ります。

4

3 に答える 3

3

これは、「on」で始まる任意の DOM 要素 (およびその子) から属性を削除する純粋な Javascript ソリューションです。

function cleanHandlers(el) {

    // only do DOM elements
    if (!('tagName' in el)) return;

    // attributes is a live node map, so don't increment
    // the counter when removing the current node
    var a = el.attributes;
    for (var i = 0; i < a.length; ) {
        if (a[i].name.match(/^on/i)) {
            el.removeAttribute(a[i].name);
        } else {
            ++i;
        }
    }

    // recursively test the children
    var child = el.firstChild;
    while (child) {
        cleanHandlers(child);
        child = child.nextSibling;
    }
}

cleanHandlers(document.body);​

http://jsfiddle.net/alnitak/dqV5k/の動作デモ

于 2012-07-18T21:31:38.927 に答える
1

インラインの onclick イベント ハンドラを使用しているため、 unbind()は機能しません。jquery/javascript を使用してクリック イベントをバインドしていた場合は、unbind() を使用してイベントのバインドを解除できます。インライン イベントを削除するには、removeAttr('onclick')を使用します。

$('a').click(function(){ //<-- bound using script
    alert('clicked');
    $('a').unbind(); //<-- will unbind all events that aren't inline on all anchors once one link is clicked
});

http://jsfiddle.net/LZgjF/1/

于 2012-07-18T21:07:02.387 に答える
-1

私はこの解決策にたどり着きました。これは、任意のアイテムのすべてのイベントを削除します。

function RemoveEvilScripts(){
    var myDiv = $('<div>').html('testing this <a href="#Foo" onclick="return runMyFunction();">Do it!</a> out');
    //remove all the different types of events
     $(myDiv)
        .find('*')
        .removeAttr('onload')
        .removeAttr('onunload')
        .removeAttr('onblur')
        .removeAttr('onchange')
        .removeAttr('onfocus')
        .removeAttr('onreset')
        .removeAttr('onselect')
        .removeAttr('onsubmit')
        .removeAttr('onabort')
        .removeAttr('onkeydown')
        .removeAttr('onkeypress')
        .removeAttr('onkeyup')
        .removeAttr('onclick')
        .removeAttr('ondblclick')
        .removeAttr('onmousedown')
        .removeAttr('onmousemove')
        .removeAttr('onmouseout')
        .removeAttr('onmouseover')
        .removeAttr('onmouseup');
    return $(myDiv).html();
}
于 2012-07-19T13:07:41.363 に答える