2011-07-11 14 views
3

ページ上のオブジェクトの束を無効にしてから、後で再び有効にします。それらのうちのいくつかはボタンではなくタグなので、onclick attrを削除することで無効にします。私は古いハンドラを.data()に格納しようとしましたが、残念ながら$(obj).attr('onclick',$(obj).data('onclick'))で復元しようとすると、属性に復元するのではなく関数を呼び出します。そして、データの代わりに別の属性に格納しようとすると、関数が格納されず、関数の戻り値が格納されます。jQueryオブジェクトの "onclick"アクションを保存して復元します。

再書き込みすべてのタグと私のページ上のすべてのonclickハンドラをせずにこれを実現する方法はありますか?

if(doEnable) { 

    $(obj).attr('href', $(obj).data('href')); 
    $(obj).attr('onclick', $(obj).data('onclick')); 


    $(obj).removeClass(EIS.config.classes.disabled); 
    $(obj).show(); 

} 
else { 
    // Save the things you're going to remove 
    $(obj).data('onclick', $(obj).attr('onclick')); 
    $(obj).data('href', $(obj).attr('href')); 

    $(obj).prop("href", null); 
    $(obj).prop("onclick", null); 

    $(obj).addClass(EIS.config.classes.disabled); 
    $(obj).show(); 
    } 

ところで、このコードはChromeとFirefoxではうまく機能しているようですが、IE8ではうまく動作せず、IE6では決して動作しません。残念ながら、クライアントはIE6で最初にテストします。

答えて

5
$(obj).attr('onclick', ... 

、あいまいでjQueryと異なるブラウザの異なるバージョンが異なる結果を有しています。おそらくあなたが望むことはしません。イベントハンドラではattrを使用しないでください。

問題がonclick属性onclick財産間の切断です。 jQueryは、過去にカーペットの下にある属性とプロパティの違いをブラシしようとしましたが、attrを使用して両方にアクセスしましたが、それらは全く異なります。これはjQuery 1.6で変更され、1.6.1で部分的に改訂され、広範な論争、混乱、非互換性がありました。

多くのプロパティで、属性と対応するDOMプロパティの値は同じです。文字列ではないすべてのプロパティを含む他のものについては、そうではありません。イベントハンドラは確かにありません。プロパティはFunctionオブジェクトですが、文字列属性は(a)HTMLのonclick="..."属性の元の文字列、(b)何もありません(onclickがスクリプトから関数オブジェクト)または(c)利用できない(古いIEで)。

はjQueryの1.6で prop()を使用して、イベントハンドラ関数のプロパティにアクセスするには:

$(obj).data('onclick', $(obj).prop('onclick')); 
... 
$(obj).prop('onclick', $(obj).data('onclick')); 

をあるいは単に実際に、よりシンプルで読みやすい昔ながらのJavaScriptを使用します。 jQueryはここで何も勝ちません。

obj._onclick= obj.onclick; 
... 
obj.onclick= obj._onclick; 
それらに登録されている他のイベントリスナーを(あなたはjQueryのを使用している場合、非常に可能性の高い意志、)持っている彼らは、のではなく、addEventListenerを/ attachEventを使用することができますので、これは確実に「ディセーブル」要素に行くのではありません

いずれかの方法古い学校のイベントハンドラインターフェイスです。

+0

Javascriptメソッドを使用するのが最も簡単な変更であり、動作するようです。 –

0

何のjQueryでイベントを結合の代わりに、onclick属性を設定することについてはどうですか?

$(obj).click($(obj).data('onclick')); 

データ属性の設定に使用するコードはありますか。

1

それだけで罰金.data()作品を経由して機能を保存するようになっています

var f1 = function() { console.log('invoked'); }; 
$('a').data('func', f1) 
var f2 = $('a').data('func'); // 'invoked' is not printed 
f1 === f2 // true 

をので、どのようにあなたが.data経由で機能を格納していますか?あなたは

a = $('a'); 
a.data('onclick', a.click()); // click handler is invoked here 

ような何かをやっているならば、あなたは実際には時期尚早クリックハンドラー(複数可)を呼び出し、そして.data()と戻り値を保存しています。

--edit--

.attr(function)が渡された関数を呼び出すことが表示されます。これはjQueryの機能です。 jQueryの.click()メソッドを使用して、この関数をクリックハンドラとしてアタッチすることをお勧めします。

a = $('a'); 
a.each(function() { 
    this.data('onclick', handler_fn); 
    this.bind('click', handler_fn); 
}); 

// later 
a.each(function() { 
    this.unbind('click'); 
}); 

// even later 
a.each(function() { 
    this.bind('click', this.data('onclick')); 
}); 
関連する問題