簡體   English   中英

將輸入類型日期從 JavaScript 動態更改為 email 在 Safari 中不起作用

[英]Dynamically changing input type date to email from JavaScript is not working in Safari

當用戶單擊按鈕時,我正在嘗試將輸入類型日期更改為 email 和 email 日期。

下面是我的 HTML 代碼。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Date Polyfill</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="email-to-date">
        <label>Email to Date:</label>
        <input type="email" name="emailDate" id="emailDate">
        <button id="btn-submit">Click me</button>
    </div>
    
    <script src="script.js"></script>
    <script src="node_modules/date-input-polyfill/date-input-polyfill.dist.js"></script>
</body>
</html> 

Javascript代碼

document.querySelector("#btn-submit").addEventListener("click", function () {
    var elem_type = document.querySelector("#emailDate").type;
    var email_elem = document.querySelector("#emailDate");
    
    if(elem_type == 'email')
    { 
       email_elem.type = 'date';
    }
    else { 
      email_elem.type = 'email';
    }
});

它在 chrome 中完美運行,但是當我在 Safari 中嘗試此操作時,當用戶單擊按鈕 email 字段更改為日期時,反之亦然,但即使它是 email 字段時也會顯示輸入文本框。

未完全更改為 email 字段。

為了支持 safari 中的日期字段,我使用了 date-input-polyfill package。

請幫我解決這個問題。

我認為要讓它在所有瀏覽器中正常工作,您可能必須刪除 DOM 元素,然后添加一個具有所需輸入類型的新元素。

document.getElementById( "emailDate" ).remove();

然后創建一個新元素並將其添加到原始父級。 因此,您更改的 function 可能看起來像這樣。 (這有點冗長,但我保留了它,以便邏輯清晰。)

document.querySelector("#btn-submit").addEventListener("click", function () {
    var email_elem = document.querySelector("#emailDate");
    var elem_type = email_elem.type;
    
    /* Remove the current node, so that we create space for the new one. */
    email_elem.remove();
    
    /* Create the new input DOM node. */
    let newInput = document.createElement( "input" );
    
    /* Create attribute nodes for "id", "name" and "type" (and whatever else you need). We already know the
     * values for "id" and "name"; so we can set them here itself. Only for "type" we need an if..else. */
    let idAttr = document.createAttribute( "id" );
    idAttr.value = "emailDate";
    let nameAttr = document.createAttribute( "name" );
    nameAttr.value = "emailDate";
    let typeAttr = document.createAttribute( "type" );
    
    if( elem_type == 'email' )
    { 
       /* Add date type */
       typeAttr.value = "date";
    }
    else { 
       /* Add email type */
       typeAttr.value = "email";
    }
    
    /* Set the attribute nodes onto the new DOM element. */
    newInput.setAttributeNode( idAttr );
    newInput.setAttributeNode( nameAttr );
    newInput.setAttributeNode( typeAttr );
    
    /* Append the new DOM element as a child of the original parent node. */
    let parent = document.getElementById( "email-to-date" );
    parent.appendChild( newInput );
});

您將面臨一個顯示順序更改的問題,您必須使用 CSS 或使用parent.insertBefore()parent.insertAfter()來控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM