Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.04.2013, 22:06
Новичок на форуме
Посмотреть профиль Найти все сообщения от Skvor
 
Регистрация: 07.04.2013
Сообщений: 8

Наследование новых методов
Хочу сделать метод подсчёта потомков первого уровня по тегу
window.document.getChildElementsByTagName = function (tagName) {
  var A=[];
  for (var i=0; i<this.childNodes.length; ++i) if (this.childNodes[i].tagName==tagName) { A.push(this.childNodes[i]); }
  return A;
};

window.alert(window.document.getChildElementsByTagName("HTML").length);

- работает.

Но если вызывать
window.document.body.getChildElementsByTagName("DIV").length

то не работает.

Возможно ли в JS наследование методов? Связано ли это с инстанцированием?
Ответить с цитированием
  #2 (permalink)  
Старый 10.04.2013, 22:45
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Skvor
Хочу сделать метод подсчёта потомков первого уровня
обязательно его в дум пихать? Вынесите в функцию и будет вам счастье. Или воспользуйтесь уже существующим - qsa.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 11.04.2013, 15:10
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

function getChildElementsByTagName ( element, tagName ) {
	var children = [];
	tagName = tagName && tagName.toLowerCase();
	for ( var child = element.firstChild; child; child = child.nextSibling ) {
		if ( child.nodeType === 1 && (!tagName || child.nodeName.toLowerCase() === tagName) ) {
			children.push( child );
		}
	}
	return children;
}
alert(getChildElementsByTagName( document, 'html' ).length)
alert(getChildElementsByTagName( document.body, 'div' ).length)
Ответить с цитированием
  #4 (permalink)  
Старый 11.04.2013, 19:21
Новичок на форуме
Посмотреть профиль Найти все сообщения от Skvor
 
Регистрация: 07.04.2013
Сообщений: 8

nikita.mmf, спасибо, практически так и сделал
function getChildElementsByTagName(pt,tagName) {
  var A=[];
  for (var i=0; i<pt.childNodes.length; ++i) if (pt.childNodes[i].tagName==tagName) { A.push(pt[i]); }
  return A;
}

только чуть меньше занудства с проверками

Вопрос - можно ли динамически приляпать объекту метод так, чтоб он стал доступен потомкам, которые инстанцированы раньше?
Ответить с цитированием
  #5 (permalink)  
Старый 11.04.2013, 19:41
Интересующийся
Отправить личное сообщение для dastingo Посмотреть профиль Найти все сообщения от dastingo
 
Регистрация: 30.01.2013
Сообщений: 29

можно
"use strict";
   function Parent() {}

   // наследуем
   var child = Object.create( Parent.prototype );

   // приляпываем
   Parent.prototype.method = function() {
      return "works fine" ;
   };
   
   // ок
   alert( child.method() );
Ответить с цитированием
  #6 (permalink)  
Старый 11.04.2013, 21:39
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Цитата:
Не стоит флудить на форуме для изучающих программирование.
Skvor, где в моем посте флуд? Очки купи.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 11.04.2013, 21:54
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от nerv_
Или воспользуйтесь уже существующим - qsa.
Как через querySelectorAll получить детей?
Ответить с цитированием
  #8 (permalink)  
Старый 11.04.2013, 22:37
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Вообще, можно сделать так:
Node.prototype.getChildElementsByTagName = function (tagName) {
  var A=[];
  for (var i=0; i<this.childNodes.length; ++i) if (this.childNodes[i].tagName==tagName) { A.push(this.childNodes[i]); }
  return A;
};
Но это, конечно, не кроссбраузерно.
Ответить с цитированием
  #9 (permalink)  
Старый 11.04.2013, 22:54
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от danik.js
Как через querySelectorAll получить детей?
var elems = document.querySelectorAll('#test > *');
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #10 (permalink)  
Старый 11.04.2013, 23:01
Новичок на форуме
Посмотреть профиль Найти все сообщения от Skvor
 
Регистрация: 07.04.2013
Сообщений: 8

BallsShaped, спасибо работает.
Я пытался поставить на window, window.document, window.documentElement и window.body, но в консоли было сообщение, что prototype для них не определён.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прототипное наследование не распространяется на вложенные свойства? novikov Общие вопросы Javascript 4 19.11.2012 14:31
Множественное наследование - миф или реальность?! B~Vladi Оффтопик 109 04.09.2012 16:13
наследование в javascript mat5978 Общие вопросы Javascript 18 23.11.2011 16:17
Скрипт перестал работать в новых версиях firefox, Opera и Chrome, а в IE работает polbear Javascript под браузер 3 30.06.2011 09:34
Наследование класса-замыкания и вызов метода предка BobiKK Общие вопросы Javascript 2 21.03.2010 13:26