2012-09-05 29 views
2

我使用的一些功能使用jQuery,例如:如何準確找出觸發事件的原因?

$(window).one('beforeunload', function() { 
//my code 
}); 

但我真的想找到所有關於什麼觸發此事件,以及如何。

我嘗試下面的代碼:

$(window).one('beforeunload', function(e) { 
alert(JSON.stringify(e)); 
}); 

但它引起了人們對圓形結構異常。當然,必須通過它來區分和調試。

我怎麼申請呢?

我希望看到什麼觸發此事件,是一個鏈接,提交的表單,一個javascript,頁面刷新,或來回按鈕或什麼的,並且它的所有罰款在這種情況下。 ,如果它是通過調用觸發打開外部應用程序,我想放棄該事件並返回null。

外部應用程序啓動的實例:

<a href="skype:your_skype_name?call" > 

任何想法?

解決

這是我如何解決它。

我只是做了一些腳本的鏈接首先,在事件以獲得更多的控制權:

<a href="javascript:void(0)" id="skype_click_ok" 

然後,我創建一個全局變量來存儲beforeunload的狀態:我手動

var dontunload=0; 

然後處理鏈接,但設置location.href,並更改變量狀態:

$('#skype_click_ok').click(function(){ 
dontunload=1; 
location.href='skype:marilynbrusas?call'; 
}); 

現在我致動人beforeunload事件,請注意one()也改爲bind()

$(window).bind('beforeunload', function() { 
    if (dontunload==1) dontunload=0; //if triggered from our skype - do nothing, yet cancel state for the next call 
    else { //Do the actual code 
      // Fade out, before leaving the page. 
     $('html#my_html').stop(true,false).css('overflow','hidden').animate({opacity:0},2000); 
     // Lock content with invalid image hack 
      $('body#my_body').prepend(
     $('<div>').attr({style:'position:fixed;height:100%;width:100%;left:0;top:0;z-index:900100;background-image:url(in-your-face)'}) 
    ); 
      // unbind the event 
     $(this).unbind('beforeunload'); 
    } 
}); 

EDIT3

其實它沒有解決。這一招並不在IE瀏覽器,也是甚至從JavaScript觸發:無效(0)鏈接...

回答

2

使用alert像事件顯示對象是相當無用的。

你爲什麼不嘗試給控制檯發送活動

function(event) { 
    console.log(event); 
} 

這樣就可以擴大你事件對象,並認爲它像結構樹。

編輯根據你對事件觸發器的位置的評論:我沒有測試過這個,但這可能是一種停止你的卸載事件的方法。

  • 傾聽所有a元素
  • 檢查元素點擊指向外部應用點擊事件(不以http://)
  • 如果不是綁定的事件處理程序beforeunload該取消展覽會立即
  • 否則取消綁定先前的處理程序

    $("a").click(function(event) { 
        if(event.target.href.indexOf("http://") != 0) { 
        $(window).on("beforeunload.override", function(e) { 
         // Stop the 'beforeunload' event. 
         return false; 
        } 
        } 
        else { 
        $(window).off("beforeunload.override"); 
        } 
    } 
    

請注意,此示例正在使用某種呼叫事件命名空間。通過指定我們想要收聽beforeunload事件,但我們有我們自己的名爲override的名稱空間,我們可以安全地添加和刪除事件處理程序,而不必刪除beforeunload事件的所有其他偵聽器。

+0

地獄,這正是我想要的,屬性列表,不只是ID或標籤名稱。現在我只需要找出一個很好的方法來捕獲外部應用程序調用。 – Anonymous

+0

是的我仍然不是100%確定你的意思,但我做了一些編輯,可能會有所幫助。 – Aesthete

+0

這是棘手的。問題是一個href不會直接觸發beforeunload事件。相反,我確實將'HTMLDocument'作爲一個event.target ...好處是你明白我現在想要達到的目標。 – Anonymous

3

可以使用event.target.id選擇傳遞什麼因素觸發事件,像這樣:

$(document).ready(function() { 
    $("a").click(function(event) { 
     alert(event.target.id); 
    }); 
}); 

jsfiddle。 作爲評註中提到,這將提醒用來選擇元素的ID,我只是用它作爲例子,你並沒有完全說出你就想獲取什麼呢?

+0

那麼這將獲得目標ID - 如果你刪除ID部分將獲得觸發事件+1的元素,儘管 –

+0

我知道如何使用event.target獲取元素。但我寧願記錄事件的所有屬性,我想要調試它,有時僅僅通過這種簡單化的方法是不夠的。 – Anonymous

0

如果您想了解事件的一切,你可以按照@Aesthete

的提醒
$('#id').click(function(e){ 
     console.log(e) 
      }); 

然後你可以查看控制檯和檢查輸出事件。

+2

我這樣做,但沒有必要複製相同的答案。 :) – Anonymous

+0

通過檢查輸出事件e你會選擇event.target.href屬性,這就是要使用控制檯 –

0

使用target="_blank"解決了這個問題,以及:

<a href="skype:your_skype_name?call" target="_blank"> 

這是相當難看,但對我來說這是隻有在所有瀏覽器完美地工作的解決方案。