$('#' + postFormId).html(xml)抛出意外调用方法错误

时间:2016-06-23 15:03:36

标签: javascript jquery xml netsuite

编辑:我已经尝试过jquery版本1.11.3和1.4.2

以下代码抛出错误"对方法或属性访问的意外调用"在模拟先前版本的ie(5和7)时。使用此仿真不是可选的,因为它由第三方IT设置。它在IE8中运行良好,并且有一个版本基本上是相同的代码(我复制并粘贴它,并进行了一些更改)用于在5和7中工作。

使用console.logs,我相当肯定问题出在$('#' + postFormId).html(xml)中,尽管我可能错了。

if( punchOutCartPage != "SalesOrder" ) {
    $(document).on('click','#btn-proceed-checkout',function(){
        var itemsXML = parseShoppingCart();
        var headerXML = "\t<header>\n\t\t{sellerId}\n\t\t{buyerID}\n\t\t{sessionId}\n\t</header>";

        var shoppingCartXML = createNetSuiteShoppingCart( headerXML, itemsXML );
        var form = $("#cart");
        var form_action = form.attr("action");                  

        $.ajax({
            url:'/app/site/backend/emptycart.nl?c=',
            context: document.body,
            success: function(data){
                var form_serialized = form.serialize(); 
                $.post(form_action, form_serialized,
                    function (val) {
                        postToPunchOutUrl(punchOutUserCartUrl, shoppingCartXML);    
                    }
                );
            }
        });
        return false;
    });
} 
function parseShoppingCart() {

}

function createNetSuiteShoppingCart( headerXML, itemsXML ) {    
    var parentCompany =localStorage.StrparentCompany;
    var account =localStorage.Straccount;
    var sessionId = localStorage.StrpunchOutSessionId;

    headerXML = headerXML.replace("{sellerId}", "<sellerID>" + encodeXML(account) + "</sellerID>");
    headerXML = headerXML.replace("{buyerID}", "<buyerID>" + encodeXML(parentCompany) + "</buyerID>");
    headerXML = headerXML.replace("{sessionId}", "<PunchOutSessionID>" + encodeXML(sessionId) + "</PunchOutSessionID>");
    itemsXML = "<NetSuiteSellerPunchOutShoppingCart>\n" + headerXML + "\n" + "<itemList>\n" + fezzik + "</itemList>\n" + "</NetSuiteSellerPunchOutShoppingCart>";
    itemsXML = encodeXML(itemsXML);

    var shoppingCartXML = '<input type="hidden" name="shoppingcart-urlencoded" value="{url-encoded-raw-xml}">';
    return shoppingCartXML.replace("{url-encoded-raw-xml}", itemsXML);
}

function postToPunchOutUrl( url, xml ) {
    var postFormId = "poomform";
    $('#' + postFormId ).html( xml );
    $('#' + postFormId ).attr( "action", url );
    document.forms[postFormId].submit();
}

function encodeXML(string) {
    return string.replace(/\&/g, '&' + 'amp;').replace(/</g, '&' + 'lt;').replace(/>/g, '&' + 'gt;').replace(/\'/g, '&' + 'apos;').replace(/\"/g, '&' + 'quot;');
}

1 个答案:

答案 0 :(得分:0)

此问题是由文档模式模拟本身引起的。当Internet Explorer模拟文档模式5或7时,它会在某些情况下在表单周围包装表单标记。所以这<form method="POST" name="poomform" id="poomform" action="https://www.example.net"></form>成了(我没有复制它,但大约是)

<form><form method="POST" name="poomform" id="poomform" action="https://www.example.net"></form></form>

然后会抛出意外调用方法错误。

我通过在页面加载后使用javascript添加表单来解决这个问题,所以我用h <div id="poomformholder"></div>

替换了html中的表单

然后在我的postToPunchOutUrl函数中添加了一行jquery,如下所示:

function postToPunchOutUrl( url, xml ) {
    $('#' + "poomformholder" ).html("<form method=\"POST\" name=\"poomform\" id=\"poomform\" action=\"https://www.example.net\"></form>");
        //The id name of our form.
        var postFormId = "poomform";
                $('#' + postFormId ).attr("action",url);
        $('#' + postFormId ).html(xml);

现在一切正常。希望这有助于将来的某些人,并感谢您的帮助!