2016-07-20 79 views
1

我有一個頁面,用戶可以編輯一些值(名稱,說明等),其工作時長字符串添加爲說明,除了罰款。處理長字符串的JavaScript

當用戶更改的輸入字段的值,JavaScript函數被調用,以檢查是否有任何值是從初始不同(當首次加載用PHP站點的初始值存儲爲變量)。它看起來像這樣:

<script> 
    //checks if a field has changed value, if yes, change class 
    function check(div, text){ 
     if(div.val()===text){ 
      div.parent().removeClass("has-warning"); 
      return 0; 
     } else{ 
      div.parent().addClass("has-warning"); 
      return 1; 
     } 
    } 
</script> 
*here goes the html stuff* 
<script> 
    //whenever the form content changes 
    $('#horse1').bind('input', function() { 
     //the form div 
     var horseDiv = $('#horse1'); 
     //count all the fields with changed value 
     var error = check(horseDiv.find($('#name')), 'Rinaldo') 
        +check(horseDiv.find($('#race')),'-') 
        +check(horseDiv.find($('#date')),'1988-01-01') 
        +check(horseDiv.find($('#use')), 'Showpferd') 
        +check(horseDiv.find($('#shortDesc')), 'short Description') 
        +check(horseDiv.find($('#description')),'This can be a long text over multiple lines'); 

        //if there is at least one field with a 
        //changed value, display an error message 
     var errorDiv = horseDiv.find($('#notSaved')); 
     if(error==0){ 
      errorDiv.hide(); 
     } else{ 
      errorDiv.show(); 
     } 
    }); 
</script> 

所以,首先,如果有人有一個想法如何使這種行爲更優雅,我願意提出建議。

但我遇到的問題是,這個劇本完全停止工作,如果文本(說明)長於一行。我不知道爲什麼或如何解決這個問題,所以任何幫助將不勝感激。

***更新:在JavaScript

比較多行文本如果任何人有同樣的問題,這裏是爲我工作的解決方案:

var textNew = text.replace(/%0D/g, ''); 
var divNew = encodeURIComponent(div.val()).replace(/!/g, '%21') 
              .replace(/'/g, '%27') 
              .replace(/\(/g, '%28') 
              .replace(/\)/g, '%29') 
              .replace(/\*/g, '%2A'); 

變量「文本」是rawlurlencode()來自php-Script和div.val()的字符串是從textarea中讀取的明文。使用上面的代碼,textNew === divNew返回true,即使它們包含逗號,不透明度,新行和其他討厭的東西

+0

請提供用於存儲JavaScript變量值的PHP代碼 – trincot

回答

1

嘗試將描述字符串傳遞到json_encode以正確地轉義它。

+0

問題是有關JavaScript的問題。但問題在於PHP方面。 PHP正在編寫文本,所以它需要被轉義,所以JavaScript可以正確解析它。 – dodopok

+0

非常感謝,這就像一個魅力:) – Juliette

+0

不客氣! :D – dodopok

0

當然,它停止工作。

在PHP端需要正確連接字符串,如果有在他們換行符。

preg_replace("/\r|\n/", "", $yourString); 
0

朱麗葉,我認爲這將是更好的,而你並不需要立即檢查文本更改爲使用事件change,而不是input。瀏覽器將爲您完成所有例程。
此外,您還需要知道腳本停止的原因,如果尚未知道)您可以查看瀏覽器中「開發工具」窗格中的「控制檯」選項卡。
如果確實需要馬上看到變化的用戶後,按下一鍵比我會建議你使用字符串方法localeCompare
這裏是回答有關比較Optimum way to compare strings in Javascript?
希望我幫你!

+0

我試圖改變,但沒有奏效 問題是我需要json對字符串進行編碼,以便它可以作爲參數傳遞 – Juliette

0

我認爲#description<textarea>既然你提到它可能是多。

您發佈它的腳本應該包含字符\n而不是腳本中的實際換行符。您需要在PHP中進行替換才能實現此目的,但不是Lemmy發佈的版本,因爲它只是刪除換行符。如前所述,您也可以只使用JSON編碼。

此外,請注意,在Windows上,瀏覽器將處理換行符\r\n而不僅僅是\n。您還需要在JS中進行替換,以便在比較之前刪除任何\r字符以處理此問題。

而且,你可以做.find("#selector")而不是.find($("#selector"))

+0

感謝您使用find的提示 - 從dodopok的json版本工作,但檢查函數不再工作了,因爲我無法將div.val()與現在被json編碼的文本進行比較。 我在JavaScript中嘗試了JSON.stringify,但比較仍然無效 – Juliette

+0

JSON編碼的結果應該類似於「」第一行\ n第二行「。這實際上是你需要比較的字符串。 –

+0

'check(horseDiv.find('#description')。replace(/ \ r /,''),'這可能是多行的長文本')' –