2013-04-24 98 views
5

幾年前,我開發了一個LOGO般的基本烏龜圖形解釋器,我不想把它放在網上(因爲我的表弟一直在竊聽我)。儘管我對HTML,Javascript編碼頗爲陌生,但我認爲我會試試&,以此作爲學習體驗。自定義Javascript函數不能按我的預期工作?

下面的代碼只是基本的用戶界面(我的用戶界面看起來非常醜,我會在以後清理它)。

我已經寫了一個叫做「cmd-form」的onsubmit的Javascript函數pushCmd。

function pushCmd() 
      { var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
       var srcElement = document.getElementById("source-container"); 
       var srcText = new String(srcElement.innerHTML); 
       srcText = srcText.toUpperCase(); 
       if (srcText.indexOf("NO CODE") != 0) 
       { 
        srcText = cmdText; 
       } 
       else 
       { 
        srcText += "<br>" + cmdText; 
       } 
       srcElement.innerHTML = srcText; 
      } 

表單聲明如下。

<div id="command-container"> 
            <form name="cmd-form" action="" onsubmit="pushCmd()" onreset="resetSource()" method="post"> 
             <input type="text" name="cmd-text" size="80"> 
             <input type="submit" value="Send"> 
             <input type="reset" value="Reset"> 
             <input type="button" value="Run"> 
            </form> 
           </div> 

pushCmd函數應該改變div「source-container」的HTML內容,默認情況下它看起來像下面那樣。

<div id="source-container">NO CODE</div> 

我提交第一個文本(比如說「FWD 100」)後。 「源容器」的內容應改爲「FWD 100」。然後如果我提交「RT 90」,內容應該是「FWD 100
RT 90」。這是我期望的。

但是當我提交文本。 「源容器」的內容只是瞬間變化,然後再次回到「無代碼」。爲什麼會發生這種情況,誰能指出我的錯誤在哪裏?

我試過都得到&後的方法,但結果是一樣的。我在Javascript控制檯中看不到任何錯誤或警告。我使用谷歌瀏覽器版本26.0.1410.63如果重要的話(我猜不是)。

如果您需要任何進一步的信息或完整的HTML源代碼,請讓我知道。

+0

既然你是js的新手,我建議你用jQuery學習。它很容易學習/使用,但功能非常強大,可以使許多事情更容易,包括選擇某些元素或元素組,綁定事件和動畫。 – smerny 2013-04-24 20:57:27

+0

@smerny ...感謝您的建議(沒有諷刺)。學習jQuery是在我的待辦事項清單上。 – 2013-04-24 21:07:45

+0

只是我的2美分,記得在學習jQuery的同時不斷嘗試學習JavaScript。可以很容易地學習如何使用框架,而不是繼續開發對幕後的理解。 – keithwyland 2013-04-24 21:14:27

回答

1

您的形式實際上是提交到空的動作。一個空行爲通常會刷新當前頁面。所以你的網頁可能會很快刷新,看起來好像是source-container div的即時變化。

而不是使用提交按鈕,嘗試鍵入=按鈕,然後在JavaScript中設置該按鈕的onclick。 (注意id=""上的HTML內容發送按鈕)

HTML

<div id="command-container"> 
    <form id="cmd-form" action="" onreset="resetSource()" method="get"> 
    <input type="text" id="cmd-text" name="command" size="80" /> 
    <input type="button" id="btnSend" value="Send" /> 
    <input type="reset" value="Reset" /> 
    <input type="submit" value="Run" /> 
    </form> 
</div> 

<div id="source-container">NO CODE</div> 

的Javascript

function pushCmd() 
{ 
    var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
    var srcElement = document.getElementById("source-container"); 
    var srcText = new String(srcElement.innerHTML); 
    srcText = srcText.toUpperCase(); 
    alert(cmdText); 
    if (srcText.indexOf("NO CODE") != 0) 
    { 
     srcText = cmdText; 
    } 
    else 
    { 
     srcText += "<br>" + cmdText; 
    } 
    srcElement.innerHTML = srcText; 
} 

document.getElementById('btnSend').onclick = pushCmd; 

見本codepen作爲該代碼的一個例子:http://codepen.io/keithwyland/pen/scAJy

+0

這看起來不錯。我想我會按照你的建議轉換Send和Reset按鈕。並且運行按鈕可以用作提交選項。 – 2013-04-24 21:29:22

+0

@mobbarley這是不好的做法。在處理提交的表單時,您應該始終處理'submit'事件。當表單的文本框關注時按下「返回」鍵時會發生什麼?在某些瀏覽器中,它提交表單...在某些情況下,它不會。 – Ian 2013-04-24 23:36:06

+0

我懷疑mobbarley會使用不同的按鈕來實際提交表單,因爲使用「發送」按鈕所需的僅僅是更新頁面上的一個元素而不進行刷新。我已經編輯了這個例子,讓mobbarley添加了運行提交按鈕。伊恩提出了一個很好的觀點,即打入表格後將提交。所以你會想要考慮如何處理。 – keithwyland 2013-04-25 00:28:44

0

您可能將整個頁面發送到服務器,這會導致它刷新,因此您將得到相同的默認值。

爲了防止發生這種情況,您可以嘗試使用AJAX,這將允許您發送數據到服務器而無需刷新整個頁面。

防止頁面提交給服務器的一種方法是將return false;添加到您的函數中。

function pushCmd() 
      { var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
       var srcElement = document.getElementById("source-container"); 
       var srcText = new String(srcElement.innerHTML); 
       srcText = srcText.toUpperCase(); 
       if (srcText.indexOf("NO CODE") != 0) 
       { 
        srcText = cmdText; 
       } 
       else 
       { 
        srcText = "<br>" + cmdText; 
       } 
       srcElement.innerHTML = srcText; 
       retrun false; 
      } 
+0

嗨,感謝您的迴應,但它只是一個本地頁面,我還沒有將其上傳到任何服務器。還有http-equiv =「刷新」元標籤。 – 2013-04-24 20:56:20

+0

如果您已經使用'onsubmit'事件,並且您的代碼正在執行,這意味着您的頁面將提交給服務器,所以阻止它的一種方法是添加'return false;' – 2013-04-24 20:58:39

+0

非常感謝。做過某事。有效。 – 2013-04-24 21:05:25

2

你需要從pushCmd返回false,並更改onsubmit屬性onsubmit="return pushCmd();"否則表單將提交本身並刷新頁面。

此外,你需要改變這一行:

srcText = "<br>" + cmdText; 

到:

srcText += "<br>" + cmdText; 

這相當於:

srcText = srcText + "<br>" + cmdText; 

這意味着要追加cmdTextsrcText。如果您沒有+=,則基本上最終只會覆蓋srcText而只有cmdText

+0

嗨vivin,做到了。你的觀點是正確的,但它仍然行不通。 – 2013-04-24 20:58:23

+1

@mobbarley請參閱我的答案,您還需要更改您的HTML屬性以返回值:'onsubmit =「return pushCmd()」' – Paulpro 2013-04-24 20:59:43

+0

非常感謝。做過某事。有效。 – 2013-04-24 21:03:57

1

您正在提交表單,因此頁面正在刷新,並將其設置恢復爲原始狀態。

根據你最終需要什麼,一種解決方案是防止表單提交。你可以在你的函數結尾使用簡單的return false;來做到這一點。

function pushCmd() { 
    var cmdText = document.forms["cmd-form"]["cmd-text"].value; 

    var srcElement = document.getElementById("source-container"); 
    var srcText = srcElement.innerHTML; 
    srcText = srcText.toUpperCase(); 

    if (srcText.indexOf("NO CODE") != 0) { 
     srcText = cmdText; 
    } else { 
     srcText = "<br>" + cmdText; 
    } 
    srcElement.innerHTML = srcText; 

    return false; 
} 
+0

非常感謝。做過某事。有效。 – 2013-04-24 21:05:02

+0

不客氣。 – grasp 2013-04-24 21:08:23

0

您需要從onsubmit事件處理程序,以阻止該網頁刷新自己返回false。當您按下提交按鈕時,您的事件處理程序會觸發,但是會立即提交表單,然後再次加載該頁面。如果您從事件處理程序返回false,則會阻止默認行爲。

function pushCmd() 
      { var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
       var srcElement = document.getElementById("source-container"); 
       var srcText = new String(srcElement.innerHTML); 
       srcText = srcText.toUpperCase(); 
       if (srcText.indexOf("NO CODE") != 0) 
       { 
        srcText = cmdText; 
       } 
       else 
       { 
        srcText = "
" + cmdText; } srcElement.innerHTML = srcText; return false; }

此外,您需要在您的事件處理程序中使用return pushCmd()而不是pushCmd()

+0

這是不正確的。與Javascript綁定的事件處理程序一起使用時,它不一致。內聯事件處理程序還需要'return functionCall();'。返回false不僅可以防止冒泡(這不會影響這個),它還可以防止默認行爲(如提交) – Ian 2013-04-24 21:05:14

+0

非常感謝。做過某事。有效。 – 2013-04-24 21:06:16

3

這是因爲HTML表單通過發送一個新的HTTP請求提交給服務器,在您的情況下,使用空操作屬性,類似於刷新瀏覽器中的頁面。爲了防止瀏覽器執行的默認操作(提交表單),你可以從你的函數返回false,加入return false;在它最後一行:

​​

然後改變你的HTML屬性返回返回從onsubmit你的函數值:

onsubmit="return pushCmd()" 
+0

爲什麼要亂用'pushCmd'?只需使用'onsubmit =「pushCmd();返回false;」' – Ian 2013-04-24 21:03:12

+0

非常感謝。做過某事。有效。 – 2013-04-24 21:04:31

+0

@Ian這樣對我來說更具可讀性。 – Paulpro 2013-04-24 21:07:01

相關問題