У меня есть объект PHP, свойства которого инициализируются следующим образом:
$this->contact = implode(PHP_EOL,$description->getContact()) . PHP_EOL;
Единственными исключениями являются два свойства с именами версия и ошибки .
Этот объект затем кодируется в объект JSON и передается в следующий javascript, который сравнивает объект JSON со значением из формы.
function compareEntry(data){
var dataProperties = ["version", "bugs", "scenario", "exception", "instruction", "sources", "risks", "test", "contact"];
var hasChanged = false;
for(var i = 0; i < dataProperties.length; i++){
var dataProperty = dataProperties[i];
alert("Original: '" + data[dataProperty] + "'\nModified: '" + document.myform[dataProperty].value + "'\nTest Value: " + (!data[dataProperty].localeCompare(document.myform[dataProperty].value)));
if(!data[dataProperty].localeCompare(document.myform[dataProperty].value)){
hasChanged = true;
}
}
[...]
За исключением версии и ошибки , все остальные свойства сравниваются со значением в текстовой области.
Поля формы инициализируются со значением объекта PHP.Когда я отправляю форму, функция вызывается.Если я отправляю форму без изменения какого-либо значения, она все равно дает false
при сравнении свойства со значением текстовой области.Почему и как я могу их правильно сравнить?
Примечания: Объект PHP является отражением записи MySQL, созданной в той же форме.В промежутке информация была зашифрована и расшифрована.Но это не должно играть роли, потому что объект PHP / JSon и начальное значение формы взяты из одного источника.
EDIT
После объясненияиз Frode, я изменил свой тестовый отчет на:
data[dataProperty].localeCompare(document.myform[dataProperty].value)!=0
Но потом я заметил две несоответствия.
- Свойства версия и ошибки которые до этого вернули
true
при тестировании вернули сейчас false
.Но в отличие от других свойств, Я не манипулирую значениями при извлечении их из базы данных. Значение версии свойства сохраняется в теге select
в форме. - И страннее, когда я меняю одно из значений в текстовой области, вместо того, чтобы дать мне
false
, он дает мне true
.
Это произошломне, что это может быть связано с реализацией JavaScript браузера, который я использую.Но результат, который я получил, не совсем такой, как я ожидал.Принимая во внимание, что у меня есть описанное поведение в Firefox и Chrome, IE и Opera бросают всегда false
(с заметным исключением сравнения версии , которая дала мне истину в IE, хотя он не мог 't получить значение тега select
).
Должен ли я использовать какой-либо другой метод для сравнения моих строк?
РЕДАКТИРОВАТЬ 2
Приняв предложение WoLpH, я изменил условие теста на:
data [dataProperty] .trim () document.myform [dataProperty] .trim ()
Где trim () - этофункция описана в этот другой вопрос .И результат обратен тому, что я имел в первом редактировании.За исключением Chrome, который, кажется, назначает его логическое значение случайно.Кажется, что-то действительно не так в моих данных.
Вот пример объекта JSON, который я вижу в Firefox (переменная data во фрагменте кода).
{"version":"REL-773","bugs":"20831","scenario":"THIS IS A TEST\r\n\r\nThis is the what happens: stuffs.\r\n","exception":"N\/A\r\n","instruction":"1. First Step.\r\n2. Second Step.\r\n2. Third Step\r\nIt is longer.\r\n4. Fourth Step.\r\n5. Fifth Step.\r\n6. Sixth Step.\r\n","sources":"me\r\n","risks":"High risks as it is just for testing of the web application.\r\n","test":"1. Select an entry\r\n2. Change some data such as <HOME>\/path\/\r\n3. See if the application run as expected!\r\n","contact":"me@web.de\r\n"}
РЕДАКТИРОВАТЬ 3
Используя функцию escape()
для экранирования всех специальных символов двух строк, я заметил, что в символе %OA
написанокак %OD%OA
в объекте JSON.Это заставило меня подозревать, что моя функция обрезки неправильно заменяет \r\n
на \n
.(Функция обрезки, которую я добавил после предложения постеров здесь.)
Вот функция, которую я использую:
if(typeof(String.prototype.trim) === "undefined")
{
String.prototype.trim = function()
{
return String(this).replace(/^\s+|\s+$/g, '').replace(/\r\n/g,"\n");
};
}