LINUX.ORG.RU

[js] Как в фоксе предполагается проверять существование свойств?


0

1

В общем случае. Не в try-catch же проверку заворачивать.

В качестве примера:

<!DOCTYPE html>
<html>
<head>
<title>Test</title>

<script type="text/javascript">
	window.addEventListener('load', function(){
		var ele = document.getElementById('test')
		alert('"selectionStart" in ele: ' + ('selectionStart' in ele));
		alert('ele.selectionStart: ' + ele.selectionStart);
	}, false);
</script>

</head>
<body>
<input type="file" id="test">
</body>
</html>

Несмотря на то, что «selectionStart in ele» выдаёт true, обращение к этому свойству даёт:

Ошибка: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMHTMLInputElement.selectionStart]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"

ele.getAttribute( «selectionStart» )

чем не подходит?

nu11 ★★★★★ ()
Ответ на: комментарий от nu11

Тем что свойство это не атрибут? И на выходе будет null и при input type=«text».

JustGuest ()

Что-то я ничего не понял. Свойство есть но к нему не обратится. Как такое может быть???

urxvt ★★★★★ ()

Проверил в файрбаге:

var el = document.getElementById("ext-gen1170");
if (el && el.selectionStart) {
    console.log('Sel start: ' + el.selectionStart);
} else {
    console.log('Sel empty');
}
Выхлоп:
// Инпут пустой
>>> var el = document.getElementById("ext-gen1170");...tionStart); } else { console.log('Sel empty'); }
Sel empty
// С текстом
>>> var el = document.getElementById("ext-gen1170");...tionStart); } else { console.log('Sel empty'); }
Sel start: 9

RR ()
Ответ на: комментарий от urxvt

> Как такое может быть?

Меня это самого интересует. Может быть что-то с безопасностью?

JustGuest ()
Ответ на: комментарий от JustGuest

> Может быть что-то с безопасностью?

А впрочем, нет. input type=«radio» ведёт себя так же странно.

JustGuest ()
Ответ на: комментарий от RR

Поменял на файл, ошибка как у ТС. Странно свойство есть, а при доступе к нему ошибка.

RR ()
Ответ на: комментарий от RR

В хроме та же фигня (type=«file»):

var el = document.getElementById("ext-gen1170");
if ('selectionStart' in el) {    
    console.log('selectionStart in el');
    try {
        var selStart = el.selectionStart;
    } catch (e) {
        console.log('Exception %o', e);
    }    
} else {
    console.log('selectionStart not exists in el');
}

// Выхлоп:
selectionStart in el
Exception 
TypeError
arguments: undefined
message: "Accessing selectionStart on an input element that cannot have a selection."
stack: "—"
type: undefined
__proto__: Error
undefined

RR ()
Ответ на: комментарий от JustGuest

тьфу, невнимательно читал, думал ты что-то свое к элементу добавляешь. А для файлового инпута использование selectionstart/end не имеет смысла согласно спеке и должно вызывать исключение

http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#textFieldSelection

When these methods and attributes are used with input elements while they don't apply, they must raise an INVALID_STATE_ERR exception

http://dev.w3.org/html5/spec/number-state.html#file-upload-state

The following IDL attributes and methods do not apply to the element: checked, list, selectedOption, selectionStart, selectionEnd, selectionDirection, valueAsDate, and valueAsNumber IDL attributes; select(), setSelectionRange(), stepDown(), and stepUp() methods.

nu11 ★★★★★ ()
Ответ на: комментарий от nu11

> В хроме та же фигня (type=«file»)

А для файлового инпута использование selectionstart/end не имеет смысла согласно спеке и должно вызывать исключение


Ага, ясно, спасибо. Значит всё-таки это по стандарту и придётся отлавливать исключение.

JustGuest ()

var el = document.getElementById('test'); if(el.getAttribute('selectionStart')){ //обращение к свойству. } тестил в хроме, работает.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.