2012-07-02 29 views
1

我們使用C#中的WatiN與瀏覽器(目前僅限IE)進行交互。IE能否同時執行2個JavaScript函數

WatiN的一些方法是一個簡單的包裝,它向特定的Web元素髮送「onchanged()」和「onclick()」。

WatiN還爲此提供了一個即開即用的版本,它基本上提供了一個非阻塞版本。

我的問題是,瀏覽器是否也有2個JS函數同時執行?

例如,假設下面的代碼:

// Uses FireEventAsync("onchanged") 
SelectList.SelectNoWait() 

SelectList.FireEventAsync("onclick") 

既能JS功能的onclick以及在調用onChanged執行一次?

我相信我們遇到類似的問題,其中onchanged()函數仍在執行,而我們觸發另一個事件,我想知道這是否技術上可行。

+1

這取決於我懷疑的瀏覽器。 – Jodrell

+1

Javascript exectuing是事件驅動的,所以當你發射'onclick'和'onchange'時,瀏覽器只是將處理程序添加到執行隊列中。比,他們順序執行。 所以,如果你的問題是「是否有可能同時發生事件」 - 答案肯定是。但是,我認爲他們執行的順序並不能保證。 – J0HN

+0

用瀏覽器類型(IE)更新了我的問題。 –

回答

1

總之:沒有。 JavaScript執行是單線程的。但是,對於異步操作(ajax,timers,workers等),函數的某些部分可以設置爲稍後在線程空閒時執行。

一個人爲的例子將是:

function foo() { 
    setTimeout(function() { 
     console.log('three'); 
    }, 10); 

    console.log('one'); 
} 

function bar() { 
    console.log('two'); 
} 

foo(); 
bar(); 

雖然foobar同步地稱爲和日誌被寫入的three, one, two順序,它們將在one, two, three順序執行作爲定時器將延遲的對數'three'以後。

而且,即使您的處理程序不使用任何異步,SelectNoWaitFireEventAsync可能也會這樣做。

+0

謝謝。我將檢查FireEventAsync的實現。這意味着可能會出現潛在的競爭狀況,這會導致怪異的行爲。 –

2

不,只要您沒有專門使用webworkers,就不能同時執行多個執行。瀏覽器上下文中只能有一個用戶線程處於活動狀態。

通常你只執行一些小函數,這些小函數在事件上被調用,大多數長任務與資源和異步相關。當你認爲「基於事件」和(最重要的是)不要嘗試從自然異步(我認爲是AJAX)進行同步調用時,你沒有任何問題。

+0

這是一個恥辱,因爲我們正在經歷似乎「競爭條件」像和非常隨機。我認爲我的理論可以解釋它。 –