Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Opera события не работают


Автор: flashaa 27.9.2007, 10:21
Есть ситуация:

такая ХТМЛ-форма:

Код

...
<script language="JavaScript" src="js/index.js">//</script>
<script language="JavaScript" src="js/main.js">//</script>
<script language="JavaScript" src="js/user_cfg.js">//</script>
<script language="JavaScript" src="lib/JsHttpRequest/JsHttpRequest.js"> //</script>
...
<form onSubmit="return false;">
<input id="email" type="text" onkeypress="key_log_in(event);"><br>
<input id="login" type="button" value="отправить" onclick="log_in();">
</form>
..


функции log_in и key_log_in находятся в файле js/main.js

Данная конструкция не работает в Опере, однако в Ие и Мозилле все ок.
Пробовал содержимое функции log_in менять на {alert('aaa');} - все равно не работает.. Такое ощущение, что Опера не дружит со скриптами,  подгружаемыми через <script src=...></script>
Помогите, пожалуйста

Автор: dsCode 27.9.2007, 10:35
flashaa, все работает:

test.js

Код

function foo() {
  alert(1);
  return true;
}


index.html

Код

<html>
  <head>
    <script type="text/javascript" src="test.js"></script>
  </head>
  <body onLoad="foo()">
    <form onSubmit="return false;">
      <input id="email" type="text" onkeypress="foo();" /><br />
      <input id="login" type="button" value="отправить" onclick="foo();" />
    </form>
  </body>
</html>


Ошибка в функции, либо в подключении. Посмотрите консоль ошибок js в Опере - что там пишут?

Автор: flashaa 27.9.2007, 11:05
Cпасибо, вот ошибка при клике на кнопку:

Event thread: click
Error:

name: ReferenceError

message: Statement on line 1: Reference to undefined variable: log_in
Backtrace:
  Line 1 of  script 

    log_in();
  At unknown location

    [statement source code not available]

Вот ещё ошибка при определении этой функции:

Inline script compilation
Syntax error while loading: line 42 of linked script at js/index.js : 

    }

---^

Привожу эту функцию log_in, a line 42 в ней - "email" : document.getElementById("email").value
Код

function log_in() {
    
    //alert('ssd');

    spinner(1);

    JsHttpRequest.query(
    caller(), // backend
    {
        // pass a text value
        "action": func_name(arguments.callee),
        "email" : document.getElementById("email").value

    },
    // Function is called when an answer arrives.
    function(result, errors) {

        if (result["status"] == 1) {

            spinner(0);

            document.getElementById("content").innerHTML = result["out"];
            document.getElementById("help").style.display = 'block';

            //устанавливаем запрос новых сообщений по таймеру
            msgInterval = setInterval("check_msg()", 2000);



        } else {

            spinner(0);
            alert(result["status"]);

        }

    },
    true  // do not disable caching
    );
}



Автор: dsCode 27.9.2007, 12:25
flashaa, ну вот не видит значит эту функцию. Попробуйте "продебажить" с самого начала - сначала пустую функцию напишите (мой же пример работает), потом добавьте нужные вызовы, через каждую строчку поставьте alert'ы - и таким образом отловите ошибку.

P.S.: Кстати, а что такое caller(), // backend? Функция caller получает имя бэкенд-скрипта? И сама же (caller()) является параметром для JsHttpRequest.query(...). Вообще, так можно, просто.. несколько странная конструкция =)

Автор: flashaa 27.9.2007, 13:16
caller возвращает имя бакенд-скрипта по URL из браузера. JsHttpRequest - библиотека для работы с AJAX написанная Дмитрием Котеровым.
http://dklab.ru

Проблема решена: оказывается Оперовский джава-скрипт не терпит задание объектов с пустыми строками:

Код

{
        // pass a text value
        "action": func_name(arguments.callee),
        "email" : document.getElementById("email").value
    }


а вот такой код работает:

Код

{ "action": func_name(arguments.callee),
   "email" : document.getElementById("email").value }

Автор: dsCode 27.9.2007, 13:39
flashaa, 
Цитата(flashaa @  27.9.2007,  13:16 Найти цитируемый пост)
caller возвращает имя бакенд-скрипта

ну я так и понял (из предыдущего поста)

Цитата(flashaa @  27.9.2007,  13:16 Найти цитируемый пост)
JsHttpRequest - библиотека для работы с AJAX написанная Дмитрием Котеровым

знаем такого человека и его библиотеку (да и лабораторию) в частности

Цитата(flashaa @  27.9.2007,  13:16 Найти цитируемый пост)
оказывается Оперовский джава-скрипт не терпит задание объектов с пустыми строками

сдается мне, что ошибка была где-то в другом (возможно, в кодировке файла, где находился js, может там перевод строки как-то обрабатывался криво, вот опера и не смогла прочитать), потому что так работает:

Код

<script>
function test(e) {
  var obj =
  {

// prperty test
  test: 2,

  q: 3

  };
  alert([obj.test, obj.q])
}
</script>
<body onload="test()"></body>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)