#javascript #iphone #safari #jqtouch
#javascript #iPhone #safari #jqtouch
Вопрос:
Я пишу приложение HTML5 с jQTouch для мобильных браузеров.
Я устанавливаю переменные, используя код, подобный этому:
var activeproduct; // globally in js file
Тогда у меня есть ul li
, который устанавливает переменную примерно так:
<li class="arrow" onclick="activeproduct=1;">
<a href="#productClickThru">Product</a>
</li>
Это отлично работает на FF, но когда я пробую это на Safari iPhone, я получаю неопределенную ошибку при попытке использовать activeproduct внутри функции.
Я не настраиваю var
должным образом? Любая помощь наиболее ценна.
Билли
В соответствии с запросом, вот еще немного кода (пожалуйста, обратите внимание, что все элементы списка в конечном итоге будут сгенерированы динамически):
Мой файл javascript:
var jQT = new $.jQTouch({
statusBar: 'black'
});
var activeproduct;
var activeroom;
var activearea;
var last_hash;
$(function(){
$(window).bind( 'hashchange',
function(){
console.log('unloading ' last_hash);
$(window).trigger('unload' last_hash);
last_hash = location.hash;
console.log('loading ' location.hash);
$(window).trigger('load' location.hash);
});
$(window).bind('unload#productsMenu', function() {
$('#productsMenuContent > *').remove();
});
$(window).bind('load#productsMenu',
function() {
console.log('Products menu loaded');
$('<li class="arrow" onclick="activeproduct=1;"><a href="#productClickThru">Strip</a></li>').appendTo($('#productsMenuContent'));
$('<li class="arrow "onclick="activeproduct=2;"><a href="#productClickThru">Prep</a></li>').appendTo($('#productsMenuContent'));
$('<li class="arrow" onclick="activeproduct=3;"><a href="#productClickThru">Heavy Prep</a></li>').appendTo($('#productsMenuContent'));
$('<li class="arrow" onclick="activeproduct=4;"><a href="#productClickThru">Line</a></li>').appendTo($('#productsMenuContent'));
$('<li class="arrow" onclick="activeproduct=5;"><a href="#productClickThru">Finished Paper</a></li>').appendTo($('#productsMenuContent'));
$('<li class="arrow" onclick="activeproduct=6;"><a href="#productClickThru">Emulsion</a></li>').appendTo($('#productsMenuContent'));
$('<li class="arrow" onclick="activeproduct=7;"><a href="#productClickThru">Satin</a></li>').appendTo($('#productsMenuContent'));
});
$(window).bind('load#productClickThru',
function() {
alert(activeproduct);
console.log('Room: ' activeroom);
console.log('Area: ' activearea);
console.log('Product: ' activeproduct);
if( activeproduct == 1 ) {
$('#productClickThru > .toolbar > :header').html('Strip');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
} else if( activeproduct == 2 ) {
$('#productClickThru > .toolbar > :header').html('Prep');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
} else if( activeproduct == 3 ) {
$('#productClickThru > .toolbar > :header').html('Heavy Prep');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
} else if( activeproduct == 4 ) {
$('#productClickThru > .toolbar > :header').html('Line');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
} else if( activeproduct == 5 ) {
$('#productClickThru > .toolbar > :header').html('Finished Paper');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
} else if( activeproduct == 6 ) {
$('#productClickThru > .toolbar > :header').html('Emulsion');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
} else if( activeproduct == 7 ) {
$('#productClickThru > .toolbar > :header').html('Satin');
$('#productClickThru').find('.room-label').html('Room: ' activeroom);
$('#productClickThru').find('.area-label').html('Area: ' activearea);
}
});
});
index.php файл:
<div id="productClickThru" class="page">
<div class="toolbar"><h1 name="title"></h1>
<a class="back button" href="#">Back</a>
</div>
<ul>
<li><span class="room-label"></span></li> //gets set by JS
<li><span class="area-label"></span></li> //gets set by JS
<li>
<select id="quantity">
<optgroup label="quantity">
<option value ="10">10</option>
<option value ="20">20</option>
<option value ="20">30</option>
<option value ="20">40</option>
<option value ="20">50</option>
<option value ="20">60</option>
<option value ="20">70</option>
<option value ="20">80</option>
<option value ="20">90</option>
<option value ="20">100</option>
<option value ="20">150</option>
</optgroup>
</select>
</li>
<li><textarea placeholder="Notes" ></textarea></li>
</ul>
<a href="#" class="submit whiteButton">Save</a>
<!-- #new-quote close -->
</div>
Комментарии:
1. где находится тег <script>? в заголовке или в нижней части тела?
2. Опубликованный вами код в порядке. Покажите нам больше! (функция, которую вы используете
activeproduct
, окружение, в котором вы объявляетеactiveproduct
).3. Насколько я понимаю, встроенные обработчики событий, подобные этому, могут вызывать только функции.
4. может быть, лучше дождаться события window.onload и addEventListener() к событию li click
5. @jayp нет, в этом нет ничего плохого (кроме того, что это, в первую очередь, навязчивое объявление встроенного обработчика)
Ответ №1:
Возможно, вам потребуется обернуть ваш js в самоисполняющуюся функцию, такую как:
<li class="arrow" onclick="javascript:(function(){activeproduct=1;})()">
<a href="#productClickThru">Product</a>
</li>
Комментарии:
1. извините, моя ошибка, я забыл добавить javascript: перед объявлением функции.. вы можете проверить скрипт в действии jsfiddle.net/mRN5b .
2. да, кажется, это работает, спасибо, не уверен, почему onclick =»activeproduct = 1″ работал для настольных браузеров, но не на safari iphone?
Ответ №2:
Назначьте свои обработчики событий в файле js
element.onclick = function(){
activeproduct=1;
};
Это был бы лучший стиль (ненавязчивый javascript), поскольку JS отделен от HTML.
Комментарии:
1. я думаю, вы имеете в виду
onclick = function
неonclick - function
2. @Matt он мог бы обернуть это в событие window.onload
3. Я не слишком уверен, означает ли ненавязчивый Java script запутанный javascript (js, который вы не видите). Как правило, назначение явных обработчиков считается плохим подходом, где бы это ни делалось. ИМХО, установка явного обработчика в отдельном файле не делает его менее навязчивым. В идеале мы должны подписаться как слушатели на соответствующее событие. Если вы будете назначать обработчики в файлах js, то в дальнейшем удобство обслуживания может стать небольшой проблемой.