2012-01-23 222 views
1

我正在創建一個簡單的懸停「地圖」。基本上懸停在一個標記和一個彈出的細節揭示。無論如何,除了我想添加一個關閉按鈕,它大部分工作正常。現在用戶可以在彈出框外點擊並關閉它,但是我需要在角落添加一個關閉按鈕。但是,我的閉幕式不會開火。目前我只是試圖在用戶點擊內容彈出窗口中的任何位置並關閉時設置它。一旦我有這個工作,我將它應用到容器中的一個樣式的div。這裏是我的HTML的示例:jquery事件不會觸發

<div id="container"> 
<div id="truck"><img src="eVie.png" width="637" height="280" alt="Evie" /></div> 
<div class="marker a"> 
<div class="content a inactive"><img src="solarpanel.jpg" width="240" height="205" alt="Solar Panels" /> 
    <h2>Solar Panels</h2> 
    <p>Here Comes The Sun: These solar panels capture light and heat from the sun to power exhibits when I’m out visiting around town.</p> 
</div> 
</div> 
<div class="marker b"> 
<div class="content b inactive"><img src="tailpipe.jpg" width="240" height="205" alt="Tailpipe Area" /> 
    <h2>Tailpipe Area</h2> 
    <p>No tailpipe, no fumes. That’s how I roll.</p> 
</div> 
</div> 
<div class="marker c"> 
<div class="content c inactive"><img src="plug.jpg" width="240" height="205" alt="Plug" /> 
    <h2>Plug</h2> 
    <p>Not An Ordinary Plug: Big trucks need more energy. To get all the energy I need, I have to have a bigger plug and a special outlet!</p> 
</div> 
</div> 
</div> 

這裏是我的jQuery。除了content.active點擊功能之外,它都可以正常工作。爲什麼?我很難過這個!

$(document).ready(function(){ 

    $(".marker").hover(
     function(){ 
      $(this).children(".content.inactive").addClass("show"); 
      $(this).children(".content.inactive").animate({width: 155}, "fast");  
     } 
     , 
     function(){ 
      $(this).children(".content.inactive").animate({width: 5, height: 23}, "fast"); 
      $(this).children(".content.inactive").removeClass("show");  
     } 
    ); 

    $(".content.inactive").click(
     function(){ 
      $(this).removeClass("inactive"); 
      $(this).addClass("active"); 
      $(this).animate({width: 435, height: 205}, "fast"); 
      $(".inactive").addClass("disabled"); 
      $(".disabled").removeClass("inactive"); 
      $(".disabled").parent().addClass("dim"); 
      $("#truck img").addClass("dim"); 
     } 
    ); 

    $(".content.active").click(
     function(){ 
      $(this).removeClass("active"); 
      $(this).removeClass("show"); 
      $(this).addClass("inactive");  
      $(this).animate({width: 5, height: 23}, "fast"); 
      $(".disabled").addClass("inactive"); 
      $(".disabled").parent().removeClass("dim"); 
      $(".inactive").removeClass("disabled"); 
      $("#truck img").removeClass("dim"); 
     } 
    ); 

    $(".content").click(function(){ return false; }); 
    $(document).on("click", function() { 
     $(".content").animate({width: 5, height: 23}, "fast"); 
     $(".disabled").addClass("inactive"); 
     $(".inactive").removeClass("disabled"); 
     $(".inactive").parent().removeClass("dim"); 
     $("#truck img").removeClass("dim"); 
     $(".active").addClass("inactive"); 
     $(".show").removeClass("show"); 
     $(".active").removeClass("active"); 
    }); 
}); 

這裏的鏈接網站:http://stlenergy.org/evie/

任何幫助,將不勝感激。我確定我的邏輯不對,或者我錯過了一些顯而易見的事情。謝謝!

+0

妮可,我當時不知道,但jQuery有.on()方法,它可以更好地滿足您的需求。 – mowwwalker

+0

謝謝,我會考慮將它切換出來。我爲最後一個函數使用了.on()方法。我認爲這對jQuery(1.7)來說是比較新的。 –

回答

1

使用此:

function inactiveClick(){ 
      $(this).removeClass("inactive"); 
      $(this).addClass("active"); 
      $(this).animate({width: 435, height: 205}, "fast"); 
      $(".inactive").addClass("disabled"); 
      $(".disabled").removeClass("inactive"); 
      $(".disabled").parent().addClass("dim"); 
      $("#truck img").addClass("dim"); 
     $(this).unbind('click'); // added this 
     $(this).click(activeClick); // added this 
     return false; // added this 
} 
function activeClick(){ 
      $(this).removeClass("active"); 
      $(this).removeClass("show"); 
      $(this).addClass("inactive");  
      $(this).animate({width: 5, height: 23}, "fast"); 
      $(".disabled").addClass("inactive"); 
      $(".disabled").parent().removeClass("dim"); 
      $(".inactive").removeClass("disabled"); 
      $("#truck img").removeClass("dim"); 
     $(this).unbind('click'); // added this 
     $(this).click(inactiveClick); // added this 
     return false; // added this 
} 
$(document).ready(function(){ 

    $(".marker").hover(
     function(){ 
      $(this).children(".content.inactive").addClass("show"); 
      $(this).children(".content.inactive").animate({width: 155}, "fast");  
     } 
     , 
     function(){ 
      $(this).children(".content.inactive").animate({width: 5, height: 23}, "fast"); 
      $(this).children(".content.inactive").removeClass("show");  
     } 
    ); 

    $(".content.inactive").click(
     inactiveClick 
    ); 

    $(".content.active").click(
     activeClick 
    ); 
    //$(".content").click(function(){ return false; }); // removed so I can unbind the elements 
    $(document).on("click", function() { 
     $(".content").animate({width: 5, height: 23}, "fast"); 
     $(".disabled").addClass("inactive"); 
     $(".inactive").removeClass("disabled"); 
     $(".inactive").parent().removeClass("dim"); 
     $("#truck img").removeClass("dim"); 
     $(".active").addClass("inactive"); 
     $(".show").removeClass("show"); 
     $(".active").removeClass("active"); 
    }); 
}); 

的問題,如鯊魚提到的,那是你的元素沒有active直到類他們被點擊,所以他們永遠不會被綁定一個點擊事件。

我做了以下內容:

  • 分的無效和有效點擊到自己的職能
  • 新增返回false兩個功能
  • 沒有限制在點擊功能結束的元素
  • 將新的點擊事件綁定到點擊函數末尾的元素

編輯:我不知道它的時候,但jQuery有一個。對()方法,這是完美的您的情況:

$(document).ready(function(){ 

    $(".marker").hover(
     function(){ 
      $(this).children(".content.inactive").addClass("show"); 
      $(this).children(".content.inactive").animate({width: 155}, "fast");  
     } 
     , 
     function(){ 
      $(this).children(".content.inactive").animate({width: 5, height: 23}, "fast"); 
      $(this).children(".content.inactive").removeClass("show");  
     } 
    ); 

    $('body').on('click',".content.inactive",function(){ 
     $(this).removeClass("inactive"); 
      $(this).addClass("active"); 
      $(this).animate({width: 435, height: 205}, "fast"); 
      $(".inactive").addClass("disabled"); 
      $(".disabled").removeClass("inactive"); 
      $(".disabled").parent().addClass("dim"); 
      $("#truck img").addClass("dim"); 
     } 
    ); 

    $('body').on('click',".content.active",function(){ 
     $(this).removeClass("active"); 
      $(this).removeClass("show"); 
      $(this).addClass("inactive");  
      $(this).animate({width: 5, height: 23}, "fast"); 
      $(".disabled").addClass("inactive"); 
      $(".disabled").parent().removeClass("dim"); 
      $(".inactive").removeClass("disabled"); 
      $("#truck img").removeClass("dim"); 
    }); 
    $(".content").click(function(){ return false; }); // removed so I can unbind the elements 
    $(document).on("click", function() { 
     $(".content").animate({width: 5, height: 23}, "fast"); 
     $(".disabled").addClass("inactive"); 
     $(".inactive").removeClass("disabled"); 
     $(".inactive").parent().removeClass("dim"); 
     $("#truck img").removeClass("dim"); 
     $(".active").addClass("inactive"); 
     $(".show").removeClass("show"); 
     $(".active").removeClass("active"); 
    }); 
}); 
+0

真棒!完美的作品。非常感謝。我(顯然)仍然在學習很多關於jQuery的知識,我無法理解這一點。我感謝您的幫助!這是有道理的看到它。 –

+0

@NicoleMcCoy,沒問題。感謝鯊魚,他發現了錯誤! – mowwwalker

1

我相信這是因爲當你的聽衆被宣佈的時候,將不會有包含類別contentactive的包裝集。因此,click()偵聽器不會被分配給任何元素。

您將能夠做這樣的事情:

$(".content").click( 
function(){ 
    var inactiveObjects = $(this).hasClass("inactive"); 
    inactiveObjects.removeClass("inactive"); 
    inactiveObjects.addClass("active"); 
    inactiveObjects.animate({width: 435, height: 205}, "fast"); 
    $(".inactive").addClass("disabled"); 
    $(".disabled").removeClass("inactive"); 
    $(".disabled").parent().addClass("dim"); 
    $("#truck img").addClass("dim"); 

    var activeObjects = $(this).hasClass("active"); 
    activeObjects.removeClass("active"); 
    activeObjects.removeClass("show"); 
    activeObjects.addClass("inactive");  
    activeObjects.animate({width: 5, height: 23}, "fast"); 
    $(".disabled").addClass("inactive"); 
    $(".disabled").parent().removeClass("dim"); 
    $(".inactive").removeClass("disabled"); 
    $("#truck img").removeClass("dim"); 
} 
); 
+0

我可能誤解了你的答案,當彈出窗口顯示時,div有兩個類的內容和活動。我已經用螢火蟲驗證了這一點。 –

+1

@NicoleMcCoy正確,但是當你的監聽器賦值代碼被執行時,沒有一個具有'active'類的對象。 – 2012-01-23 03:16:50

+0

好吧,我還沒有真正理解,但我試過上面的代碼,它阻止了我的彈出窗口打開。:( –

0

我只是看着您的網站。我認爲如果您刪除.content.active.content的點擊處理程序並將return false;添加到.content.inactive處理程序的末尾,那麼您可以通過現有代碼獲得所需內容。點擊活動內容時不會返回false,點擊事件會觸發document處理程序,並且應該關閉打開的對話框。這將會讓您將對話框關閉代碼全部保存在一個地方。