2014-04-11 101 views
0

我可以在被視爲JavaScript代碼的HTML元素上創建自己的屬性,並且可以在我的代碼需要時執行它們嗎?我可以創建自己的事件屬性嗎?

例如,假設我想創建一個自定義事件onpagerefresh,並且同時允許編寫HTML的人添加處理此事件的屬性。

<body onpagerefresh="updateContents()"> 

我能夠解析HTML得到這個新onpagerefresh屬性的值,但我怎麼告訴JavaScript的這個屬性爲JavaScript代碼,而不是字符串治療什麼?

+1

而第一個說「_使用eval()」_的人會被打耳光。 – IQAndreas

+3

他們爲什麼會被打呢?如果你有一個字符串,並且你想把它當作JavaScript代碼,'eval()'或者它的一個朋友是最好的工具。如果你只是調用函數,你可以使用'window [fnName]()'。 – alex

+0

@alex如果您覺得'eval()'在這種情況下是正確的選擇,那麼請添加一個關於爲什麼在這種情況下是個好主意的推理。 – IQAndreas

回答

1

您可以使用new Function(),function constructor從字符串中獲取函數對象,然後將其分配給對象的屬性。例如:

var divElement = document.getElementById('mydiv'); 
divElement.onpagerefresh = new Function("èvent", "alert();"); 

這是否是比任何有意義的方式的eval()更好的是有爭議的(儘管它給你一個不同的範圍內),但是這將是你怎麼做。在您的情況下,一個更好的選擇可能是允許執行HTML的人使用先前存在的函數名稱(onpagerefresh="updateContents"),然後簡單地執行該函數。 window["updateContents"]()。這樣你就不會讓任何舊的DOM插入在你的代碼中寫入隨機的JavaScript。但是,這當然限制了功能。

+0

'new Function()'正是我正在尋找的,因爲它允許您傳遞所有「vanilla」DOM事件中可用的'event'參數。 – IQAndreas

+0

但我認爲你的代碼中有一個錯字。 'e'應該是一個字符串,(理想情況下命名爲'event'以匹配其他DOM事件):'new Function(「event」,「alert();」);' – IQAndreas

+0

第二,設置'onpagerefresh'屬性與「分配給屬性」不同。 – IQAndreas

0

如果你想創建伴隨着聽衆的支持實際事件,Mozilla文章介紹的方式這樣做:

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

你的情況:

var event = new Event('onpagerefresh'); 

// Listen for the event. 
elem.addEventListener('onpagerefresh', function (e) { 
    updateContents(); 
}, false); 

// Dispatch the event. 
elem.dispatchEvent(event); 

雖然,請小心跨瀏覽器支持。

+0

關於跨瀏覽器支持,所有具有'addEventListener()'的瀏覽器都應該有'dispatchEvent()',對吧? – IQAndreas

+0

這是正確的。 IE 8和以下是特殊的,我相信會需要attachEvent()和fireEvent() – wongcode

相關問題