2010-09-16 37 views
3

我的沙箱是在這裏:http://9.latest.truxmap.appspot.com/爲什麼我的Javascript函數只能工作多次?

首先點擊地圖上的標記(如果有沒有在頁面加載時,檢查「食品的卡車即將開業」導航控件箱)。接下來轉到「評價」標籤。

在GWT中,每當我打開標記時,我都會調用javascript函數resizeReviewTab(),它可以糾正由於狀態和檢查選項卡中的內容爲動態而引起的樣式問題。如果Javascript正常工作,那麼您將看到STARS,而不是單選按鈕浮動在「評論」選項卡中文本區域的正上方。否則,你會看到簡單的單選按鈕。

我無法弄清楚當標記DOESNT打開時會發生什麼。它怎麼能工作一次,然後不再,然後在幾個不同的標記之後再工作?繼承人的功能,這就是所謂的:

function resizeReviewTab(){ 

    $('#content').text(""); 

    $('.statusWindowB').css('height', $('.statusWindowA').css('height'));     

    $('.name-sliding').focus(function() { 

     $('.name-label-sliding').animate({ marginLeft: "133px" }, "fast"); 

      if($(this).val() == "name") 
       $(this).val() == ""; 

     }).blur(function() { 

      if($(this).val() == "") { 
       $(this).val() == "name"; 
       $('.name-label-sliding').animate({ marginLeft: "12px" }, "fast"); 
      } 
     });  

    $('.content-sliding').focus(function() { 
      $('.content-label-sliding').fadeOut("slow"); 
    }); 

    starify(); 
} 

starify()是與一些修改的jQuery插件jquery.stars的JavaScript,在這裏看到:http://9.latest.truxmap.appspot.com/lib/jquery.rating.js

我需要調用這個函數,因爲如果我只是負載它在html文檔的開頭,沒有任何通過點擊地圖創建的信息窗口將其單選按鈕變成星號。

這很麻煩,我期待着您的回覆。謝謝!

+0

與工作演示一起玩和源代碼的問題?我一定在做夢:)當我今天回到家時,我肯定會研究這個(調試GWT + JS可以是PITA:/)。 PS:你究竟如何調用'resizeReviewTab()'函數? – 2010-09-16 11:54:49

+0

無法在Firefox中重現,但在側面注意X關閉彈出窗口不關閉彈出窗口。 – 2010-09-16 14:00:51

+0

@Igor,我打開信息窗口後打電話給resizeReviewTab()。 resizeReviewTab()在GWT中被定義爲一個JSNI函數,它有一行:resizeReviewTab(); @TB,地圖infowindow彈出窗口或彈出菜單欄的彈出窗口? – 2010-09-16 20:45:29

回答

1

通過@amurra給出的兩個答案和@meouw是有效的,並可能造成在未來的問題。然而,在OP中詢問問題的答案是GWT每次調用活動單元格時都會調用SelectionChangedHandler TWICE - 一次單元格被取消選擇時,一次當另一個單元格被重新選擇時。這導致JavaScript函數被兩次調用,背靠背,這導致了討厭的行爲。非常感謝這個主題的幫助!

0

如果某個函數被多次調用,您可能需要在綁定之前解除綁定您的事件。這將有助於防止多重綁定,這可能會導致奇怪和不一致的結果。

function resizeReviewTab(){ 

$('#content').text(""); 

$('.statusWindowB').css('height',$('.statusWindowA').css('height'));     

$('.name-sliding').unbind("focus").focus(function() { 

    $('.name-label-sliding').animate({ marginLeft: "133px" }, "fast"); 

     if($(this).val() == "name") 
      $(this).val() == ""; 

    }).unbind("blur").blur(function() { 

     if($(this).val() == "") { 
      $(this).val() == "name"; 
      $('.name-label-sliding').animate({ marginLeft: "12px" }, "fast"); 
     } 
    });  

$('.content-sliding').unbind("focus").focus(function() { 
     $('.content-label-sliding').fadeOut("slow"); 
}); 

starify(); 

}

2

這些位肯定是破

if($(this).val() == "name") 
    // next line is checking whether val equals "" 
    // we already know it equals "name" 
    // so it returns false(which is discarded) 
    $(this).val() == ""; "name" , 

而且

if($(this).val() == "") { 
    // next line is checking whether val equals "name" 
    // we already know it equals "" 
    // so it returns false(which is discarded) 
    $(this).val() == "name"; 
    $('.name-label-sliding').animate({ marginLeft: "12px" }, "fast"); 
} 

我認爲你的意思

if($(this).val() == "name") 
    $(this).val(''); // sets val to nothing 

而且

if($(this).val() == "") { 
    $(this).val("name"); // sets val to "name" 
    $('.name-label-sliding').animate({ marginLeft: "12px" }, "fast"); 
} 
+0

這是從一個jQuery插件直接複製 - 但你絕對正確,它沒有多大意義。 – 2010-09-16 21:00:06

相關問題