2012-12-03 48 views
3

我從jQuery得到一個令人難以置信的反應,我希望有人可以幫助我。我有一個簡單的問題...我設置了一個HTML窗體隱藏字段的「值」(也就是,<input type='hidden'>當窗體加載。我有一個窗體有三個隱藏字段,兩個工作正常。 。好吧,這裏的問題:從jQuery(與其他一些奇怪的文物)延遲響應

一旦表單完成加載(是的,它已加載,可見...作爲間接證明前兩個隱藏的字段已加載併成功由jQuery設置),我運行以下代碼(只顯示爲這最後的領域的相關片段是一個日期設置爲「今天」):

case "today": 
    SetFieldValue (targetElement , Date.today().toString("yyyy-MM-dd HH:mm:ss")); 
    console.log ('Setting ' + jQuery(targetElement).attr('id') + ' to "today": ' + Date.today().toString("yyyy-MM-dd HH:mm:ss")); 
    break; 

的SetFieldValue是一個小功能,我寫允許設置DOM元素,無論是什麼類型的這是代碼。如下:

function SetFieldValue (domObject, value) { 
    // as a safety function, check if a string representation of the domObject was passed in and convert it to a jQuery object if it was 
    if (jQuery.type(domObject) === "string") { 
    domObject = jQuery(domObject); 
    } 

    if (jQuery.inArray (domObject.prop('tagName').toLowerCase(),['input' , 'select' , 'textarea']) >= 0) { 
    console.log ("setting to value attribute: " + value); 
    domObject.attr('value',value); 
    console.log ("now set to: " + domObject.attr('value') + "(" + domObject.attr('id') + ")"); 
    } else { 
    console.log ("setting to html attribute"); 
    domObject.html(value); 
    } 
    return domObject; 
} 

請注意console.log消息,因爲這對於理解問題的嚴重性很重要。當我運行這一點,這就是我得到的控制檯上:

enter image description here

現在,我在「今天」 case語句的最後一行(又名,在「破;」行)設置一個斷點。基於控制檯消息一切都很好。它看起來已經設置了DOM元素#activity-start_time。那麼這裏是奇怪的地方。

我做的第一件事是測試參照「targetElement」的第一件事情調試器控制檯給我是一個空數組:

empty set

什麼?這很奇怪。雖然我在思索幾秒鐘過去,突然間它解決了我所期望的問題(我不會將它重新輸入到控制檯,它只是從空集到您看到的下面):

and now for something completely different

既然targetElement與我所期望的完全一致,那麼我會用jQuery做一個簡單的檢查,即#activity-start_time的DOM元素報告相同的值。你可以看到上面的結果。它與targetElement完全相同,除非它沒有值。什麼?!?

我完全喪失。任何幫助將不勝感激。

p.s.我會注意到其他人已經建議使用.prop而不是.attr兩者似乎表現得完全一樣。

+0

你不轉動targetElement成jQuery對象'SetFieldValue(targetElement' 然而,你的記錄,請...這似乎是奇怪的,可能與您的代碼會導致的問題。 –

+0

@jeff我不是確定你的意思。我檢查函數的頂部是否傳遞給我的是「字符串」,如果是,那麼它將被轉換爲jQuery對象。在大多數情況下 - 特別是在這種情況下 - 傳入的對象已經是一個jQuery對象。 – ken

+0

但是如果它是一個未被jQueried的DOM對象呢?你似乎明確地將其包含在日誌中,但不是直接傳入時才進行。可能/可能不是你的問題,但讓你的函數接受一個I​​D可能更安全,然後直接在函數頂部的jQuery選擇器中選擇ID。只是一個想法。可能值得在你的===「string」塊中加入一些日誌記錄來查看它是否被打中。 –

回答

0

我知道我沒有提供足夠的背景讓人們真正深入瞭解這個問題,但我最終解決了這個問題。這個問題是什麼?真的很傻...並不總是?無論如何,這僅僅是問題'id'中的DOM元素不是獨特的。哎呀。總是那些顯而易見的事情會讓你陷入麻煩中。

無論如何,感謝您的耐心和幫助。