задерживать функцию javascript до тех пор, пока файл не будет загружен на страницу asp - PullRequest
1 голос
/ 12 января 2012

Может кто-нибудь сказать, пожалуйста, как отложить сброс div-фонового изображения до завершения загрузки файла?Все части работают по отдельности, однако мне нужно отложить настройку фона, чтобы всплыло предупреждение, а затем оставить некоторое время, прежде чем нажимать «ОК» - я не могу этого сделать, поскольку пользователь не будет знать, как долго нужно выходить, прежде чем нажимать ..Любая помощь приветствуется, хотя я должен сказать, что я кратко посмотрел на jquery / ajax, но обнаружил, что он будет работать в IE только один раз, прежде чем потребуется обновление страницы

Html ...

<iframe id="MyFrame" name="MyFrame" style="display:none;"></iframe>
<form id="browseform" method="post" action="disp_photosave.asp" enctype="multipart/form-data"  target="MyFrame">
    <p>Please select your photo...</p>
    <img src="Images/button_browse.gif">
        <input type="hidden" name="tab" value="0">
        <input type="file"  id="upload" name="filesent" onchange="this.form.submit(); load_bk_photo()">
        <input type="hidden" name="tempid" value="<%=(TId)%>">
        <input type="hidden" name="side" value="<%=(strSide)%>">
        <input type="hidden" name="varid" value="<%=(Request.querystring("varid"))%>">
        <input type="hidden" name="prodid" value="<%=(Request.querystring("prodid"))%>">
</form>

javascript ...

function load_bk_photo(){
    var activeId = '<%=(activeTempStoreId)%>'
    var redStr_id = "side1"
    d = new Date();
    time_temp = d.getTime();
    photoUrl = "photos/merged_"+activeId+"_"+redStr_id+".png?"+d.getTime()
        alert ("timebbb = "+time_temp )
    $('#resizable-img').css('background-image','url("' + photoUrl + '")');
    $('#resizable-img').css('display','block');
}

vbscript на disp_photosave.asp ...

<%
Set Upload = Server.CreateObject("csASPUpload.Process")
Set Image = Server.CreateObject("csImageFile.Manage")

prodid = prodSet.Fields.Item("id").Value
redStr = "side1"
fieldPrefix = "front_"

If Upload.FileQty > 0 Then
    Image.ReadVariant Upload.FileData(0)
    Image.WriteFile Server.MapPath("this works ok"
      Image.ResizeFit scale_width, scale_height
      Image.WriteFile Server.MapPath("this works ok"
    storeHeight = Image.Height
    storeWidth = Image.Width

    Set MyConn=Server.CreateObject("ADODB.Connection")
        MyConn.Open "dsn=xxx;uid=xxx;password=xxx;"
        SQLString = "this works ok"
        MyConn.Execute(SQLString)
        MyConn.Close
    Set MyConn = Nothing
End if
%>

Мне также нужно вернуть значения storeHeight и storeWidth на главную страницу для последующего использования, так что если кто-нибудьможете посоветовать мне и это тоже.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Ваша функция load_bk_photo имеет некоторые проблемы (отсутствие точек с запятой, создание глобальных переменных), попробуйте перейти к следующему:

function load_bk_photo(){

    //we can use the `var` keyword once and separate each variable declaration by a comma, then finish all the declarations with a semi-colon
    var activeId  = '<%=(activeTempStoreId)%>',
        redStr_id = "side1",
        d         = new Date(),
        time_temp = d.getTime(),
        photoUrl  = "photos/merged_" + activeId + "_" + redStr_id+".png?" + time_temp;

    alert ("timebbb = " + time_temp );

    //you can use one `.css()` function call to do both operations
    $('#resizable-img').css({
        'background-image' : 'url("' + photoUrl + '")',
        display            : 'block'
    });
}

Вы создавали глобальные переменные, которые необходимы, только если вы изменяетезначения переменных, выходящие за рамки этой функции.

На ваш главный вопрос вы можете установить обработчик событий load для элемента <iframe> в качестве функции обратного вызова при загрузке:

$('#MyFrame').on('load', function () {
    //The iframe has loaded and you can do what you want, including get the contents of the iframe (server-response)
    var response = $(this).contents().find('body').text();
});

Обязательно установите эту привязку до изменения источника <iframe>.

Обратите внимание, что .on() является новым в jQuery 1.7 и в этом случае совпадает с .bind().

.on(): http://api.jquery.com/on

ОБНОВЛЕНИЕ

Я не знаю asp classic, но если вы выводите что-то вроде storeWidth|storeHeight в коде aspтогда вы можете получить этот ответ в своем JavaScript и делать с ним что хотите:

$('#MyFrame').on('load', function () {
    //The iframe has loaded and you can do what you want, including get the contents of the iframe (server-response)
    var response = $(this).contents().find('body').text().split('|');
    alert(response[0] + 'x' + response[1] + 'px');
});
0 голосов
/ 12 января 2012

Я бы использовал метод глобального обратного вызова:

JavaScript:

window.uploadComplete = function (returnData) {
    $('#resizable-img').css('background-image','url("' + returnData.photoUrl + '")');
    $('#resizable-img').css('display','block');  
    alert(returnData.storeHeight + "|" + returnData.storeWidth);
}

И в ASP, верните это в iFrame:

<script>
parent.uploadComplete({photoUrl: "urltophoto",storeHeight: "<value from asp var>", storeWidth: "<value from asp var>"});
</script>
...