【问题标题】:delay javascript function until after file has been uploaded on asp page延迟javascript函数,直到文件上传到asp页面之后
【发布时间】:2012-01-12 05:33:46
【问题描述】:

谁能告诉我如何延迟 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');
}

disp_photosave.asp 上的 vbscript...

<%
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 返回到主页以供以后使用,所以如果有人也可以就此提出建议。

提前感谢您的帮助。

【问题讨论】:

    标签: javascript jquery file-upload asp-classic vbscript


    【解决方案1】:

    您的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'
        });
    }
    

    您正在创建全局变量,只有在您更改此函数范围之外的变量值时才需要这样做。

    在您的主要问题上,您可以将 &lt;iframe&gt; 元素的 load 事件处理程序设置为上传时的回调函数:

    $('#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();
    });
    

    确保在更改&lt;iframe&gt; 的源之前设置此绑定。

    请注意,.on() 是 jQuery 1.7 中的新内容,在这种情况下与 .bind() 相同。

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

    更新

    我不知道 asp 经典,但如果你在你的 asp 代码中输出类似 storeWidth|storeHeight 的东西,那么你可以在你的 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');
    });
    

    【讨论】:

    • 谢谢贾斯珀。我的 javascript 编码很新,所以感谢您的更正。你能告诉我你的意思是什么'之前绑定......' 可能是一个愚蠢的问题,但我不确定你的意思。谢谢。
    • 我的意思是,您需要先将事件处理程序绑定到 iframe,然后再将表单提交给它。如果你提交表单然后绑定load事件; load 事件可能会在您实际设置事件处理程序之前触发。简而言之,将$('#MyFrame').on('load'... 代码放入document.ready 处理程序($(function () {$('#MyFrame').on('load'...}))中。这将确保在事件触发之前和 DOM 准备好进行操作之后进行绑定。
    • 嗨贾斯珀。恐怕我相处得不好。我已按照您的建议将代码放入其中,但并不高兴。您能否澄清此代码是否必须从中调用“load_bk_photo()”?我不得不尝试保存我们的网站,因为网络开发公司破产了!我的学习曲线很陡峭......
    【解决方案2】:

    我会使用全局回调方法:

    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>
    

    【讨论】:

    • 嗨凯文。谢谢你的回复。我不熟悉全局回调 - 我会稍微阅读一下。希望它能找回我需要的数据。我早上试试。谢谢。
    • 凯文,我试过了,但一定是做错了什么。 uploadComlte 确实触发(没有出现警报)。它需要在调用页面中的位置吗? asp 代码放置在 asp 文件中的文件上传之后(以及 Set Upload=Nothing 命令之前和之后。有什么想法吗?(为了清楚 disp_photosave.asp 是 iframe 正在调用的单独页面,我'我已经把asp代码放在那里了。)
    • 嗨凯文。恐怕我无法将值返回到调用页面。 asp 页面只包含 所以'parent.upload..' 行代码可以按原样工作还是还有什么要添加的?抱歉这个愚蠢的问题,但正如我对 Jasper 所说,我不得不尝试保存我们的网站,因为网络开发公司破产了,我正在努力收拾残局!
    • 凯文,我让它工作了。我愚蠢地将 parent.upload..' 代码放在 vbscript 中而不是放在末尾(在 之外。非常感谢您的帮助。我相信我会问更多问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多