所有的參數 - 就像關於事件的所有其他信息 - 應該在Event Object本身中進行。完全獨立的事件對象攜帶全部關於該事件所需的信息。當新的自定義事件對象是創建的(不是事件被觸發時)時,通常會設置您的參數值。
(所有的示例代碼下面完全匹配所有其他片段片段事實上,一些例子可能不是由自己多大意義;每當出現這種情況是指前面的例子片段)
對於自己的論點,在某些情況下,你可以重用現有的字段(或者甚至添加自己的新領域):
var newEvent = ...
newEvent['scrollX'] = your-own-custom-value;
究竟如何,這些會得到取決於您是否可以使用一套不同新的標準化HTML5的方式,或者必須回退到較舊的瀏覽器支持。 (甚至對根本沒有提供任何東西的舊瀏覽器添加自定義事件支持的各種「墊片」在這裏未被涵蓋 - 其中許多將提供他們自己的獨特方式來設置參數。)
The HTML5方法涉及「字典」(第二)參數給對象的構造,這樣的事情:
var newEvent = new CustomEvent('customname', { propertyname : propertyvalue,
anotherpropname : anotherpropvalue,
thirdpropname : thirdpropvalue,
etcpropname : etcpropvalue } );
相應的較舊的方法將看起來像這樣:
var newEvent = document.createEvent();
newEvent.initEvent('customname', true, true);
newEvent['propertyname'] = propertyvalue;
newEvent['anotherpropname'] = anotherpropvalue;
newEvent['thirdpropname'] = thirdpropvalue;
newEvent['etcpropname'] = etcprovalue;
(上面的例子也可讓它更清楚HTML5 CustomEvent co nstructor實際上在做)
雖然使用現有的屬性名稱(或創建自己的屬性:-),但通常不推薦使用,因爲跨瀏覽器問題和調試麻煩可能非常嚴重。有一段時間,這將是必要的,它會起作用,但不要把它作爲一種通用技術。儘管某些類型的事件對象包含特定的命名屬性,但類似類型的事件對象可能不會。一些事件屬性可能是「只讀」的。從一個瀏覽器到另一個瀏覽器,甚至瀏覽器版本之間,事件對象內部高度可變創建自己的新屬性可能會混淆瀏覽器的Javascript實現。
取而代之,請使用「預留」的一個特定屬性,以用於自定義事件中,而不是其他任何內容:詳細信息。
通常你會有幾個參數,但只有一個屬性留出供您使用。因此,傳統的方法是要始終讓所有的參數到只是一個「對象」,這樣的事情:
var myargs = { my : 1,
own : getElementById('foo');
args : { X : 32, Y : 53 } };
設置這個變量的HTML5的方式將類似於:
var newEvent = new CustomEvent('customname', { bubbles : true,
cancelable : true,
detail : myargs });
老接口做同樣的事情會是這個樣子:
var newEvent = document.createEvent();
newEvent.initEvent('customname', true, true);
newEvent['detail'] = myargs;
(當然,如果你頻繁使用Javasript「文本對象」花括號語法來減少你的典型您的代碼可能與上述清晰度優先級示例略有不同)。
(無論設置了可能的自定義參數,必須始終爲每個事件設置兩個現有的事件屬性'bubbles'和'cancelable' 。如果正在使用新的HTML5方式,它們將始終顯示爲作爲CustomEvent構造函數第二個參數的對象中的另外兩行。如果使用較舊的方式,它們將成爲initEvent(...)調用的第二個和第三個參數。)
還提供了兩種不同的觸發自定義事件的方法。較新的HTML5方式使用object.dispatchEvent(newEvent)。舊的方法使用object.fireEvent('customname',newEvent,false)。這裏的「object」是指DOMObject/Element;如果「對象」是除DOM元素之外的東西,則究竟發生了什麼(如果有的話)。與本主題的其餘部分相比,元素更具有瀏覽器特定性。 (混合HTML5的方式和舊的方式通常是可行的,但可能會引起混淆,另一個常見的混淆之處是系統函數名爲fireEvent(...),同時也定義了自己的函數名稱)。
(在觸發自定義事件的兩種方式之間存在一些不同之處,舊的fireEvent(...)方法要求您重新指定事件的名稱,即使您已經在initEvent(...)中指定了它,並且舊的fireEvent(...)方法不會觸發「默認操作」[無論這意味着什麼)。)
另一方面,自定義參數以相同的方式訪問,無論HTML5還是使用了設置事件的老式方法。它會是這個樣子:
function customhandler(evt) {
alert(evt.detail.own);
如果一些自定義的值實際上對象本身,點號能得到這麼長時間它可能看起來像一個錯字......但事實並非如此。例如:
function customhandler(evt) {
alert(evt.detail.args.X);
看來一些,這可能在IE 9運作方式略有不同及以下,雖然。希望這些問題只是通常嘗試重新使用事件對象的甚至創建屬性的問題。如果問題更加普遍,你可以在你的網站上放一個「抱歉:-(」信息,或者你可以等待IE6/7/8/9死機,或者你可以嘗試跨瀏覽器自己破解它,或者你可以使用某種墊片/回退功能,但我不清楚是否最好找到與傳統界面「看起來完全相同」的墊片,或者使用墊片提供的備用界面作爲一切(即使傳統界面是可用)
(免責聲明:當然,我可能是錯的一些上面的... :-)
我能問爲什麼編輯?爲什麼投票下來? –
-1沒有研究。看到我的答案。 –
另外,編輯是從標題中刪除Javascript。有標籤,不需要將其包含在標題中。 –