2015-10-06 3 views
2

Я создал функцию, которая проверяет, если элемент anny textfield в HTML, содержащий класс «txt», изменил значение, которое загрузила страница. Если текст anny был изменен, функция должна возвращать true в выражении if, иначе false. Однако им только становится ложным. Что я делаю неправильно?Вызов функции с if statments

HTML:

<h3>Handlartext1...</h3> 
<textarea class="txt">Hejsan</textarea><br/><br /> 

<h3>Handlartext2...</h3> 
<textarea class="txt">Hejsan</textarea><br/><br /> 

<h3>Handlartext3...</h3> 
<textarea class="txt">Hejsan</textarea><br/><br /> 

<input id="btnClick" type="button" value="Save changes" /> 

Сценарий:

$('#btnClick').on("click",function() { 
    if(CheckTextChange()) { 
     alert('TRUE'); 
    } 
    else { 
     alert('FALSE'); 
    }  
}) 


function CheckTextChange() { 
var previousVal = $(".txt").get(0).defaultValue, currentVal = $(this).text(); 
//Checks if values have changed in elements containing class="txt" 
$('.txt').each(function() { 
     //alert($(this).text()); //or $(this).text(); 

     if (currentVal != previousVal) {   
      return true; 
     } 
     else { 
      return false; 
     } 
    }) 
} 
+1

ваш функция возвращает ничего (неопределенное) - что является ложным - вам нужно полностью переписать CheckTextChange –

+0

, вы делаете 'return' из обратного вызова _each_, а не _Check Функция TextChange_ – Grundy

+0

Я думаю, вам может потребоваться определить ваши предыдущие и текущие в каждом из них. Разве это не то, что ты собираешься делать? Посмотрите, изменились ли какие-либо из них? –

ответ

0

Ваша функция CheckTextChange имеет несколько вопросов:

  1. это будет только когда-либо проверить первое значение
  2. Текст не получал правильно

Вы можете изменить его на следующее:

function CheckTextChange() { 

    //Checks if values have changed in elements containing class="txt" 
    var isChanged = false; 
    $('.txt').each(function() { 
     var previousVal = $(this).get(0).defaultValue, 
      currentVal = $(this).val(); 
     //alert($(this).text()); //or $(this).text(); 

     if (currentVal != previousVal) { 
      isChanged = true; 
     } 
    }); 

    return isChanged; 
} 

Fiddle

2

Есть много проблем с вашим кодом. Например, когда вы читаете text() из $(this), ваша функция не знает, что такое this. Без фактически решить вашу проблему, возможно, это приведет вас в правильном направлении: http://jsfiddle.net/6ymxw4mg/

$('#btnClick').on("click", function() { 
    CheckTextChange() 
}) 

function CheckTextChange() { 

    $('.txt').each(function() { 

     if ($(this).val() == $(this).prop("defaultValue")) { 

      alert($(this).val() + ' == ' + $(this).prop("defaultValue")); 

     } else { 

      alert($(this).val() + ' != ' + $(this).prop("defaultValue")); 

     } 
    }) 
} 
+0

Это правильно. Ваша область видимости 'this' в вашем случае относится к области окна vs вашего объекта jQuery. Обратите внимание, что внутри '.each()' вы можете использовать это и ссылаться на объект jQuery. В качестве забавного теста для проверки на предмет проверки этой скрипки http://jsfiddle.net/6ymxw4mg/1/ –

1

Вы можете использовать JQuery change() событие для отслеживания один из текстовых полей, изменяется. У вас несколько атрибутов того же класса. В ответе (function() {..})() называется IIFE. Это очень бессильно, если вы хотите, чтобы ваши переменные не отображались в глобальной области. Пример: вар IsChanged получит глобальные и другие страницы могут изменить это значение

(function(){ 

     var IsChanged = false; 
     $('#btnClick').on("click",function() { 
     if(IsChanged) 
     console.log('Changed'); 
     else 
     console.log('Not changed';) 
    }); 

     $('.txt').change(function(){ 
     IsChanged = true; 
     }); 

    })(); 
+0

Хотя этот ответ может быть правильным, добавьте некоторое объяснение. Отказ от основной логики более важен, чем просто предоставление кода, поскольку он помогает ОР и другим читателям исправить эту и подобные проблемы сами. – CodeMouse92

+0

Я добавил несколько пояснений. Надеюсь, это будет полезно для других. –

0

Если вы хотите знать, если какое-либо значение изменилось:

function CheckTextChange() { 
    var rtrn = false; 
    $('.txt').each(function() {  
     var previousVal = $(this)[0].defaultValue, currentVal = $(this).val(); 
     if (currentVal != previousVal) {   
      rtrn = true || rtrn; 
     } 
    }) ; 
return rtrn;  
} 
-4

Try This

<h3>Handlartext1...</h3> 
<textarea class="txt">Hejsan</textarea><br/><br /> 

<h3>Handlartext2...</h3> 
<textarea class="txt">Hejsan</textarea><br/><br /> 

<h3>Handlartext3...</h3> 
<textarea class="txt">Hejsan</textarea><br/><br /> 

<input id="btnClick" type="button" value="Save changes" /> 

<script type="text/javascript"> 

$(document).ready(function(e) { 
var prevValue = $('.txt').val(); 
var newValue = ''; 
    $('#btnClick').on("click",function() { 
    CheckTextChange(); 

}) 
$('.txt').on("blur", function() { 
    newValue = $(this).val(); 
}) ; 

function CheckTextChange() 
{ 
    //var previousVal = $(".txt").get(0).defaultValue, currentVal = $(this).text(); 
    //Checks if values have changed in elements containing class="txt" 
    if(newValue != ''){ 
    if (prevValue != newValue) {   
     alert('true'); 
    }else { 
     alert('false'); 
    } 
    }else{ 
    alert('no changes made'); 
    } 
} 
}); 
</script> 
+0

Я проигнорировал это, и я нахожу подозрительным, что этот ответ получил так много голосов.На самом деле он ничего не добавляет по сравнению с предыдущими ответами, он не содержит описания, кроме «попробуйте это», и он даже не работает должным образом (попробуйте изменить одно из текстовых полей, а затем щелкнуть, но не изменять, другой текст Этот код затем даст false при нажатии кнопки) – ioums

Смежные вопросы