2013-06-02 90 views
1

我是要設置圖像的大小,我將從ajax收回。問題是我不知道如何在成功後輕鬆地激活功能。在ajax成功執行js函數

我的大小調整功能(這工作時,我火借自己從阿賈克斯後,Chrome瀏覽器開發控制檯,但不會阿賈克斯後全自動去):

function resizePromiseImage(x) { 
       x.success(function() { 
        var wW = window.innerWidth, 
         app = $('#app'), 
         picH = 0, 
         ratio = 0, 
         picW = app.find('img').width(); 

        if(wW < picW){ 
         app.find('img').css({ 
          'width':wW 
         }); 
        } 
       }); 
      } 

我的AJAX功能(這使我像就像我想):

function ajax(){ 
       return $.ajax({ 
           url: 'http://blabla.bla/bla.php', 
           success: function(data){ 
            if(data){ 
             var url = 'http://blabla.bla/bla/'+data+'.jpg', 
              app = $('#app'); 

             app.html('<img src="'+url+'">"'); 

            }else{ 
             $('#wrap').append('pusto'); 
            }     
           } 
         }); 
      } 

和執行代碼:

// get a promise: 
var promise = ajax(); 

// give a promise to other function: 
resizePromiseImage(promise); 

回答

2

我想稍微建議不同的方法:

function resizePromiseImage() { 
    var wW = window.innerWidth, 
     app = $('#app'), 
     picH = 0, 
     ratio = 0, 
     picW = app.find('img').width(); 

     if(wW < picW){ 
     app.find('img').css({'width':wW}); 
     } 
}); 

......然後,在主要部分,只是......

var promise = ajax(); 
promise.done(resizePromiseImage); 

你現在做的是試圖修改回調函數中的承諾本身的success財產。這是可能的(但方式稍有不同:在代碼中將x.success替換爲x.done),但這沒什麼意義。


但它看起來像實際的問題是不是promise - 是關於變更,只是不想上班的圖像。這個問題實際上是由於圖像加載的延遲引起的:當app.find('img').width()行被調用時,<img>元素已經在DOM中......但它尚未得到它的真實尺寸(因爲圖像還沒有在這裏)。

要解決此問題,您可能需要使用以下方法:將resizePromiseImage設置爲圖像加載處理程序,而不是回調函數。一種可能的方法是修改AJAX回調函數:

// ... 
if (data){ 
    var url = 'http://blabla.bla/bla/'+data+'.jpg', 
     $app = $('#app'), 
     $img = $('<img>').load(resizePromiseImage).attr('src', url); 
    $app.empty().append($img); 
} 
// ... 

這樣,您可以修改您的大小調整功能,所以需要<img>沒有額外的搜索:

function resizePromiseImage() { 
    var $img = $(this), 
     picW = $img.width(), 
    // ... 
} 

...換句話說,你」將該圖像參考作爲其上下文傳遞給該函數(this),並且不再需要其他查找(app.find('img'))。如果你這樣做,你不再需要在promise.done上調用該函數。

+0

一切都好你在不同的方法fn resizePromiseImage()?尋找代碼塊的結尾,我認爲你錯過了一些代碼 – norbert

+0

是的,我把它剪掉了,因爲它實際上並不相關。我的觀點是,當你可以將函數傳遞給它的'done'方法時,你不必增加promise對象。 – raina77ow

+0

仍然不能用var promise = ajax(); promise.done(resizeImage()); (resizeImage()==沒有x.done的正文) – norbert

0

嘗試將x.success重命名爲x.done。

根據jQuery文檔:

棄用注意:該jqXHR.success(),jqXHR.error(),和 jqXHR.complete()回調棄用的jQuery 1.8。要準備 您的代碼以進行最終刪除,請改用jqXHR.done(),jqXHR.fail(), 和jqXHR.always()。

+0

我已將x.success更改爲x.done(甚至是x.always),但仍然沒有任何反應 – norbert

+0

Firebug中是否顯示任何錯誤? – akhikhl

+0

只是:視口目標densitydpi不支持 – norbert