簡體   English   中英

我無法繼續為dijit.form.Select開火

[英]I can't get onChange to fire for dijit.form.Select

我似乎無法正確地將onchange事件附加到dijit.form.Select小部件。 但是,我是網絡開發的新手,所以我可能會做一些完全愚蠢的事情(雖然,我能說得最好(而且我已經讀過我能找到的所有文檔)我不是)。 我確保body類匹配dojo主題,我為所有使用的小部件(和dojo.parser)dojo.require(),仍然是,nada。 我正在使用的代碼是:

dojo.addOnLoad(function () {
    var _query = dojo.query('.toggle');
    for (var i in  _query) {
        dojo.connect(_query[i], 'onchange', function (ev) {
            console.log(ev + ' fired onchange');
        });
    }
});

任何幫助都將不勝感激。

另外:在深入研究dijit如何呈現小部件的內部之后,我發現當我將dojoType ='dijit.form.Select'屬性 - 值對添加到我的html元素(以聲明方式執行此操作)時,dijit實際上呈現了一個 - 行二列表。 表的第一個元素是一個span(帶有類dijitSelectLabel),我假設它只顯示所選(或默認)元素。 它的第二個元素似乎是一個呈現為向下箭頭的按鈕,用於切換菜單主題的顯示以響應某些DOM事件。 另外(我認為這非常漂亮),dijit實際上並沒有將選擇選項放在DOM樹中,直到觸發其中一個事件。 在一個新的頁面加載(在我點擊任何東西之前)之后我立即查看了firebug中的HTML,並且第二個選項無法找到。 然后,一旦我點擊箭頭按鈕,就會有一個dijit.Menu小部件,dijit會將dijit.Menu粘貼到body節點的末尾; 在我點擊其他地方之后,Menu小部件仍然是正文的lastChild,現在它只是隱藏而沒有附加到form.Select小部件。

如果我想要做的就是在DOM樹中放置一個不同的dijit.form小部件,具體取決於用戶選擇的項目,它真的會這么復雜嗎?

結論:原來這是一個大寫問題。

dojo.connect(widget_obj, 'onChange', function_obj);
工作,而

 dojo.connect(widget_obj, 'onchange', function_obj); 
沒有。

所以我說得對,我是完全愚蠢的。 我假設因為全部小寫版本在放置html標記作為屬性時起作用,Dojo會對它進行同樣的處理。 這是有道理的,因為dijit.form.Select沒有.onchange屬性,但確實有.onChange屬性。 (我最后堅持使用.Select over .FilteringSelect,因為我不會給我的用戶任何印象,他們可以輸入某些東西。)那么,你們哪一個我做的答案(因為你們兩個)在你的帖子中有變化,我想我只是太缺乏經驗才意識到這個案例很重要)?

對於通過網絡搜索找到此頁面的任何其他人,您可能犯了同樣的錯誤。復制粘貼您的標記,使每個都具有相同的“價值”。

例如

<select dojoType='dijit.form.Select' onChange="fn">
<option value='foo'>Foo 1</option>
<option value='foo'>Foo 2</option>
<option value='foo'>Foo 3</option>
</select>

永遠不會調用fn(),因為更改處理程序代碼會根據先前選擇的值檢查新值,並且除非更改,否則不會觸發onChange。

在執行dojo.connect時嘗​​試以下操作:

  var inputEvents = [];  //Global var

  inputEvents.push(dojo.connect(dijit.byId(inputFldStr), "onChange", eventFuncObj));

將連接存儲在全局變量中。

在您的代碼中,您將處理程序連接到dom節點的'onchange'事件,而不是dojo小部件。 dojo.query返回一個NodeList對象 - 與查詢匹配的節點集合。
在這種情況下,連接到小部件的'onChange'事件更加可靠,正如GoinOff所示。 只是為了確保你做對了,他的回答只是一點點。
假設這是你的html(在更高版本的Dojo中,dijit.form.Select已被替換為dijit.form.FilteringSelect):

<input dojoType="dijit.form.FilteringSelect" id="stateInput" store="stateStore" searchAttr="name" name="state"/>

然后你將以這種方式連接到'onChange'(你也可以將連接存儲在某個數組中以便以后能夠斷開連接,如GoinOff建議的那樣):

dojo.addOnLoad (function () {
   dojo.connect(dijit.byId("stateInput"), "onChange", function(){});
}

但是,如果您不知道窗口小部件的ID並希望使用dojo.query連接到多個窗口小部件,那么這是另一個故事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM