Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   когда не хватает библиотек типа JQuery? (https://javascript.ru/forum/misc/32349-kogda-ne-khvataet-bibliotek-tipa-jquery.html)

tenshi 16.10.2012 22:17

$('body')[0].attributes
//       ^
//       | в этой точке мы понимаем, что jquery бесполезен
//       | и лезем к данным через DOM API
//       | при этом получаем мы NamedNodeMap,
//       | который даже forEach не поддерживает

tenshi 16.10.2012 22:27

задача по сложнее: как с помощью jquery обрамить все вхождения слова "jquery" тэгами <my_found>

tenshi 16.10.2012 22:29

> jQuery легко делает то чего не может

jMünchhausen)

nerv_ 16.10.2012 22:33

Цитата:

Сообщение от tenshi
при этом получаем мы NamedNodeMap
который даже forEach не поддерживает

Array.prototype.slice.call( attributes ).forEach ...

Цитата:

Сообщение от tenshi
задача по сложнее: как с помощью jquery обрамить все вхождения слова "jquery" тэгами <my_found>

поподробней

Цитата:

Сообщение от tenshi
в этой точке мы понимаем, что jquery бесполезен

он и так слишком толстый, все предусмотреть не возможно

melky 17.10.2012 00:12

Цитата:

Сообщение от tenshi (Сообщение 210641)
$('body')[0].attributes
//       ^
//       | в этой точке мы понимаем, что jquery бесполезен
//       | и лезем к данным через DOM API
//       | при этом получаем мы NamedNodeMap,
//       | который даже forEach не поддерживает

да, но есть же элементаршейший поиск по селектору ...

который не будет оборачивать в гламурный объект наш чистенький элемент.
$.find("body").attributes;



Цитата:

Сообщение от tenshi
задача по сложнее: как с помощью jquery обрамить все вхождения слова "jquery" тэгами <my_found>

можно добавить? чуточку.

так, чтобы не посбивались обработчики (addEventListener, не делегированные) и ссылки на существующие элементы, которые существуют наравне с обычным текстом.

BallsShaped 17.10.2012 00:59

Цитата:

Сообщение от nerv_
Array.prototype.slice.call( attributes ).forEach

Как по мне, так логичнее было бы так:
Array.prototype.forEach.call( attributes,..

bes 17.10.2012 01:11

<head>
<style>
my_found {
	background: gray;
}
</style>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
jQuery(function ($) {
	$('body').find(':contains("jquery")').contents()
	.filter(function () {
		return  this.nodeType == 3;
	})
	.each(function () {
		var str = this.nodeValue.replace(/(jquery)/g, '<my_found>$1</my_found>');
		$(this).replaceWith(str);
	});
	$('body').contents().each(function () {
		if (this.nodeType == 3  && this.nodeValue.indexOf('jquery') != -1) {
			var str = this.nodeValue.replace(/(jquery)/g, '<my_found>$1</my_found>');
			$(this).replaceWith(str);
		}
	});
	alert($('body').html());
});
</script>
</head>
<body>
<div  onclick="alert(1)">jquery text1</div>
jquery
<span onclick="alert(2)">
	text2 
	<span onclick="alert(3)">
		text3 jquery 
		<button>jquery text</button>
	</span>
</span>
</body>


<head>
<style>
my_found {
	background: gray;
}
</style>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
jQuery(function ($) {
	$('body').find(':contains("jquery")').contents()
	.filter(function () {
		return  this.nodeType == 3;
	})
	.add ($('body').contents()
		.filter(function () {
			if (this.nodeType == 3 && this.nodeValue.indexOf('jquery') != -1) {
				return this;
			}
		})
	).each(function () {
		var str = this.nodeValue.replace(/(jquery)/g, '<my_found>$1</my_found>');
		$(this).replaceWith(str);
	});

	alert($('body').html());
});
</script>
</head>
<body>
<div  onclick="alert(1)">jquery text1</div>
jquery
<span onclick="alert(2)">
	text2 
	<span onclick="alert(3)">
		text3 jquery 
		<button>jquery text</button>
	</span>
</span>
</body>

Maxmaxmахimus 17.10.2012 01:12

Кстати еще jQuery не умеет делать операции с большими числами..
А так же не умеет складывать числа и умножать их... Как например мне получить половину от количества букв во втором по алфавиту атрибуте пятого элемента в наборе?? может ли такое jQuery ??? вот и я про то!!

tenshi, хватит херню пороть я те сказал что jQuery нужна для работы с DOM и она умеет ВСЕ для работы с DOM и даже больше.

п.с. $('ololo').width() тоже возвращает не jQuery обьект, а число, это является прямым доказательством что jQuery не может работать с числами!! и дать нам например половину от ширины.. Нам придется это делать РУКАМИ, ЗА пределами jQuery!!!!1 а вдруг число дробное и нам нужны точные вычисления? jQuery так не умеет. Я думаю jQuery говно.

melky 17.10.2012 08:42

Цитата:

Сообщение от Maxmaxmахimus
ВСЕ для работы с DOM и даже больше

по-моему, аккуратное оборачивание текста в элементе это тоже работа с DOM.

Maxmaxmахimus 17.10.2012 11:15

Прости я не понял о че то о каком оборачивнии? тред особо не читал)

tenshi 17.10.2012 14:31

> $.find("body").attributes;

ну охуеть теперь) с NamedNodeMap так приятно работать..

> Array.prototype.forEach.call( attributes,..

$( attributes ).each( ...

но факт остаётся фактом - через jq нельзя получить список аттрибутов элемента. можно лишь получить сам элемент и через его апи получить этот список, а потом завернуть список обратно в jq.


> поподробней

а что тут не понятно?

> так, чтобы не посбивались обработчики (addEventListener, не делегированные) и ссылки на существующие элементы, которые существуют наравне с обычным текстом.

разумеется, и чтобы состояние контролов и позиция каретки чтобы не менялась)


> он и так слишком толстый, все предусмотреть не возможно

есть такая вещь как модульность, про которую разработчики jq видимо не слышали

tenshi 17.10.2012 14:55

bes, всё хорошо, вот только не все вхождения находит

<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<style>
my_found {
	background: yellow;
}
</style>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
jQuery(function ($) {
    $('button').click(function(){
        alert($('body').html())
        return false
    })

	$('body').find(':contains("jquery")').contents()
	.filter(function () {
		return  this.nodeType == 3;
	})
	.add ($('body').contents()
		.filter(function () {
			return this.nodeType == 3 && this.nodeValue.indexOf('jquery') != -1
		})
	).each(function () {
		var str = this.nodeValue.replace(/(jquery)/g, '<my_found>$1</my_found>');
		$(this).replaceWith(str);
	});
});
</script>
</head>
<body>
<div>jquery text1</div>
<b>j</b>Query
<a href="jquery.com">
	text2 
	<span>
		text3 jquery 
		<button>jquery text</button>
	</span>
</a>
</body>

bes 17.10.2012 15:16

Цитата:

Сообщение от tenshi
не все вхождения находит

здесь <b>j</b>Query
и здесь href="jquery.com"
тоже должен найти?

tenshi 17.10.2012 15:22

первый очевидно да, второй очевидно нет

melky 17.10.2012 17:23

Цитата:

Сообщение от tenshi
разумеется, и чтобы состояние контролов и позиция каретки чтобы не менялась)

тогда можно сразу сказать, что в JQ нет методов для работы с TextNode - только с обычными элементами.

но об этом мы уже говорили страницу - две назад )

tenshi 18.10.2012 01:40

TextNode тут не особо поможет. нужно использовать TextRange

nerv_ 18.10.2012 21:25

Цитата:

Сообщение от BallsShaped
Как по мне, так логичнее было бы так:
Array.prototype.forEach.call( attributes,..

согласен. Сделал так, как сделал потому, что думал forEach не будет работать с не массивом.

Цитата:

Сообщение от tenshi
есть такая вещь как модульность, про которую разработчики jq видимо не слышали

мешок Деда Мороза должен быть толстым и тяжелым :D


Часовой пояс GMT +3, время: 04:09.