2012-06-12 93 views
1

無法訪問混合html/js ajax響應中的javascript代碼。 jQuery的AJAX文檔狀態:jQuery:處理混合html/js ajax響應

如果指定的HTML,則HTML返回爲一個字符串

,我可以通過添加一個簡單的代碼片段,以確認之前執行檢索 數據內的任何嵌入的JavaScript html回覆:

<script type="text/javascript"> alert($(this)); </script> 

那麼如何保留對js代碼的訪問與一次性完成執行?嘗試實現模態登錄(以防止在表單提交屏幕中會話超時時丟失數據)。當然,我需要能夠訪問ajax'd js代碼,然後驗證電子郵件/密碼字段和ajax驗證遠程服務器上的用戶憑據。

這裏的模態登錄CoffeeScript的片段:

# submit form 
$.ajax 
    success: (data) -> ... 
    error: (data) -> 
    popAuth(data.responseText) if(data.status == 401) 

popAuth = (title) -> 
    $.fancybox({ 
    href: "/login" 
    ajax: { type: "GET" } 
    title: title 
    }) 

也許我可以成功的回調添加到popAuth()AJAX選項存儲返回的JS代碼?如何jQuery「現場」處理程序?不幸的是,這種情況下是不是直線前進的人們希望;-)我見過$.getScript作爲一種選擇,但我們更希望從JS不是獨立的HTML,因爲服務器端已經組裝HTML + JS和原來的Ajax調用拉它一氣呵成。 (即避免創建一個專用的服務器端控制器來發回js文件內容包)

我當然會打開其他解決方案來解決此問題。例如,我可以存儲登錄字段和JS登錄驗證碼每個屏幕上(JVM CRUD應用生活背後WordPress的前端,每個屏幕基本上是身份驗證的要求)在一個隱藏的div,然後在彈出的模式登錄窗口中的「本地」,這我假設會繞過令人討厭的一次又一次完成遠程ajax內容的執行。

無論如何,意見讚賞!客戶端是非常簡單和...非常複雜;-)

回答

0

好吧,抵禦真正的洪水反應,我會採取刺自己。

正如我現在明白了吧,既然混合HTML/JS的內容是一和完成執行,我們有一個機會來捕捉Ajax響應JS代碼,並將其綁定到當前範圍。首先,在原始的ajax調用(即表單提交返回潛在的401未授權狀態)中,將模式登錄的ajax設置的上下文設置爲$(this),當前執行的作用域包含jquery驗證和其他共享模式登錄ajax提交工作所需的js代碼。

在我的情況下,使用的fancybox,添加背景PARAM它現在看起來像:

popAuth = (title) -> 
    $.fancybox({ 
    href: "/login" 
    ajax: { type: "GET" } 
    context: $(@) 
    title: title 
    }) 

然後,由於父窗口包含了大部分所需的JavaScript的,唯一的要求是創建一個js文件結合模式登錄表單按鈕點擊事件來驗證和$ .ajax提交。

# login.coffee 
jQuery -> 
    $('#loginSubmit').click (e) -> 
    e.preventDefault() 
    isValid = $('#loginForm').validate().form() 
    if isValid 
     $('#spinner').show() 
     $.ajax 
     data: $('#loginForm').serialize() 
     success: (data) -> 
      $('#status').fadeOut() 
      location.href = '/foo' 
     error: (data) -> 
      $('#status > div').html(data.responseText) 
      $('#status').fadeIn() 
     complete:() -> 
      $('#spinner').hide() 

做,一切都很好,工作;-)