форма dataTables не будет правильно отправлена ​​в Internet Explorer - PullRequest
0 голосов
/ 05 апреля 2019

TL; DR - все работает достаточно хорошо, ЗА ИСКЛЮЧЕНИЕМ для обновления фрейма корзины в конце. Даже window.location.reload(true);, который, как я думал, заставил перезагрузить всю страницу, не работает, но нажатие F5 будет.

Мой вопрос, в конечном счете, связан с тем же вопросом, представленным в в этом вопросе . Для DataTables требуется действительный HTML, поэтому <form> должно быть дочерним по отношению к <td>. Я пытаюсь найти решение javascript, чтобы формы в каждой строке работали в IE и более старых Edge, которые не поддерживают form attribute для входных данных вне тегов <form>, как показано в этой репрезентативной строке dataTables (это обычно показывает 25 одновременно):

<table>
    <tr>
        <td></td>
        <td>
            <form id="101110" name="form" method="post" action="Cart.cfm" target="cart_frame">
                <input name="ItemID" type="hidden" id="ItemID" value="101110">
                <input title="Click to add to cart" name="Submit" type="submit" class="buttons" value="101110">
                <input name="Qty" type="hidden" value="">
                <input name="Brand" type="hidden" value="">
                <input name="Pack" type="hidden" value="113">
                <input name="UOM" type="hidden" value="CS">
            </form>
        </td>
        <td><input form="101110" title="Type number and ENTER to add to cart" name="Qty" type="text" id="Qty" value="" size="1" maxlength="4"></td>
        <td><input form="101110" name="Broken" type="checkbox" id="Broken"></td>
        <td>MY AWESOME WIDGET #115</td>
        <td></td>
        <td>115</td>
        <td>48.50</td>
        <td>&nbsp;</td>
        <td>0.52</td>
    </tr>
</table>

Я придумала уродливое решение javascript для перехвата отправки, поиска двух других входных данных и добавления их данных по мере необходимости, отправки XMLHttpRequest и перезагрузки страницы. Однако, несмотря на то, что верный responseText возвращается и отправляется на cart_frame, рамка покажется пустой, пока я не нажму F5. Вот мой источник:

    document.addEventListener('submit', function(e) {
        // disable the normal form submit handler
        e.preventDefault();
        // store reference to form
        const form = e.target;
        var XHR = new XMLHttpRequest();
        var urlEncodedData = "";
        var urlEncodedDataPairs = [];

        // convert form elements into an array of URL-encoded key/value pairs.
        for (var i = 0, element; element = form.elements[i++];) {
            urlEncodedDataPairs.push(encodeURIComponent(element.name) + '=' + encodeURIComponent(element.value));
        };
    /*
    *** FIND THE QTY AND BROKEN INPUTS AND ADD TO ABOVE ARRAY
    *** IF TABLE STRUCTURE CHANGES IT WILL BREAK THIS!!!
    */
        // get the NEXT td element of the form's parent node
        var tdSib1 = form.parentNode.nextElementSibling;
        // get child element (Qty)
        var input1 = tdSib1.firstElementChild;
        urlEncodedDataPairs.push(encodeURIComponent(input1.name) + '=' + encodeURIComponent(input1.value));
        // get the child of the NEXT td (Broken)
        var input2 = tdSib1.nextElementSibling.firstElementChild;
        //console.log(input2.name  + '=' + input2.checked);
        if (input2.checked) {
            urlEncodedDataPairs.push(encodeURIComponent(input2.name) + '=on');
        }
        // convert array into a single string and replace all %-encoded spaces to 
        // the '+' character; matches the behaviour of browser form submissions.
        urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');
        console.log(urlEncodedData);

        XHR.addEventListener('load', function(event) {
            // success
            if (XHR.readyState === XHR.DONE) {
                if (XHR.status === 200) {
                    var destframe = parent.document.getElementsByName('cart_frame')[0];
                    destframe.src = XHR.responseText;
                    //console.log(XHR.responseText);
                    //destframe.contentWindow.location.reload(true); //did not work either
                    // what do I need to get cart to refresh properly???
                    window.location.reload(true);
                }
            }
        });

        XHR.addEventListener('error', function(event) {
            alert('Oops! Something went wrong.');
        });

        // Set up our request
        XHR.open('POST', form.action);

        // Add the required HTTP header for form data POST requests
        XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        XHR.send(urlEncodedData);
    });

Как заставить принудительно обновить iframe корзины, чтобы он показывал обновленный responseText? Если по какой-то причине это имеет значение, то этот iframe находится в скрытом <div> в то время, когда корзина обновляется в фоновом режиме, и просто отображает обновленное количество элементов на кнопке на главной странице, которая изменяет div показаны и скрыты, чтобы показать корзину, когда они готовы к оформлению заказа.

В качестве альтернативы, есть ли лучший способ выполнить отправку формы в одной строке dataTables в IE? Я знаю, что не могу изменить структуру HTML таблицы и формы, и она должна поддерживаться в IE 11. Я перенесу свой источник в свою собственную функцию, чтобы он также мог запускаться при нажатии Enter в элементе Qty input.

1 Ответ

0 голосов
/ 12 апреля 2019

Оказывается, я не был достаточно далеко в DOM. Изменение

window.location.reload(true);

до

window.top.location.reload();

было все, что было необходимо для перезагрузки всей страницы. : /

В качестве альтернативы, это также работало без перезагрузки всего, так что это то, что я решил сделать.

destframe.src="cart.cfm";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...