отфильтровать DOM = элементы
Привет! Как отфильтровать нужные элементы? Чтобы возвращало только элементы-потомки, соответствующие селектору?
_init_.prototype.childrenFilter = function(el) {
var kids = [];
for (var i = 0; i < this.s.length; i++) {
for (var c = this.s[i].firstChild; c != null; c = c.nextSibling)
if (c.nodeType === 1) kids.push(c);
}
var filterKids = [];
for(var i = 0; i < kids.length; i++){
if(_A_(el) == _A_(kids[i])){
filterKids.push[kids[i]];
console.log(filterKids[i])
}
//for(; i<filterKids.length; i++)
//this.s[i] = filterKids[1];
}
return _A_(filterKids);
}
|
В современных браузерах есть matches/matchesSelector. С остальными придётся посношаться.
|
sash003,
Приведите HTML код к данному скрипту (сломаешь глаза разбираться) и краткое описание нужных деяний |
sash003,
_init_.prototype.childrenFilter = function(el) {
var kids = [];
for (var i = 0; i < this.s.length; i++) {
var arr = Array.prototype.map.call(this.s[i].querySelectorAll(el), function(el) {
return el
});
for (var c = this.s[i].firstChild; c != null; c = c.nextSibling)
if (c.nodeType === 1 && arr.indexOf(c) != -1) kids.push(c);
}
return _A_(kids) ;// подумай что делать если массив пустой
}
|
Не верю я в нужность такой структуры, хорошо б узнать задачу и HTML
Ибо тут сосед унитаз к полу приклеивал жидкой сваркой несколько часов, кады он на два болта ставится за десять мин с хорошей дрелью |
Deff,
собирал по кускам творения sash003, может у него иной комплект. нажимать кнопку показать не рекомендуется для душевного спокойствия.
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
a{
height: 50px;
background-color: #0000CC;
color: rgb(153, 255, 255);
font-size: 28pt;
}
</style>
</head>
<body>
<p>
<a href="#">рррррррр</a></p><br><div><a href="#">рррррррр</a></div><div><a href="#">рррррррр</a><a href="#">рррррррр</a></div>
<script>
function _init_(el){
this.s = typeof el == "string" ? document.querySelectorAll(el) : el.length ? el : [el];
}
// главная и самая сложная функшн
function _A_(el){
return new _init_(el)
}
_init_.prototype.css = function(obj){
if(typeof obj === 'object'){
for (var e = 0; e < this.s.length; e++){
for (i in obj){
this.s[e].style[i] = obj[i];
}
}
return this;
}
else {
if(obj === 'width') return this.s[0].offsetWidth;
if(obj === 'height') return this.s[0].offsetHeight
else return this.s[0].style[obj] || getComputedStyle(this.s[0])[obj];
}
}
_init_.prototype.attr = function(){
}
_init_.prototype.slideUp = function (duration){
var self = this;
this.css({'overflow' : 'hidden'});
var height = parseInt(this.css('height'));
for(var i = 1; i <= height ; i++){
(function(i){
setTimeout(function(){
self.css({'height' : (height-i)+'px'}); // this.css is not a function. хотя overflow устанавливает перед этим
}, i*duration/height);
})(i);
}
return this;
}
// установка обработчиков
_init_.prototype.on = function(event, func, param){
for(var i = 0; i < this.s.length; i++){
addEvent(this.s[i], event, func, param);
}
}
_init_.prototype.html = function(html){
for(var i = 0; i < this.s.length; i++){
this.s[i].innerHTML = html
}
}
function addEvent(elem, type, handler, param){
param = param || false;
handler.bind(elem)
if(elem.addEventListener){
elem.addEventListener(type, handler, param);
} else {
elem.attachEvent('on'+type, handler);
}
return false;
}
function fn(n)
{
return function() {
_A_(this).css({'backgroundColor' : 'red'})
_A_(this).html(n++); // чтобы так можно было делать
}
}
_init_.prototype.children = function() {
var kids = [];
for (var i = 0; i < this.s.length; i++) {
for (var c = this.s[i].firstChild; c != null; c = c.nextSibling)
if (c.nodeType === 1) kids.push(c);
};
return _A_(kids);
}
_init_.prototype.childrenFilter = function(el) {
var kids = [];
for (var i = 0; i < this.s.length; i++) {
var arr = Array.prototype.map.call(this.s[i].querySelectorAll(el), function(el) {
return el
});
for (var c = this.s[i].firstChild; c != null; c = c.nextSibling)
if (c.nodeType === 1 && arr.indexOf(c) != -1) kids.push(c);
}
return _A_(kids) ;
}
_A_('body').childrenFilter('div').css({'backgroundColor' : 'red'}).html('hhhh')
//var x = _A_("p");
//x.slideUp(1000)
</script>
</body>
</html>
|
а можно мне объяснить зачем вобще нужно делать через прототипы?
почуме делают так
*!*_init_.prototype.on*/!* = function(event, func, param){
for(var i = 0; i < this.s.length; i++){
addEvent(this.s[i], event, func, param);
}
}
а не так?
*!*_init_.on*/!* = function(event, func, param){
for(var i = 0; i < this.s.length; i++){
addEvent(this.s[i], event, func, param);
}
}
|
Цитата:
|
рони,
Как всегда, работает! Благодарю :) Я б в жизни не додумался |
Цитата:
|
sash003,
Цитата:
return kids.length ? _A_(kids) : falseи так везде
function _init_(el){ if (!el) return
|
Знаешь, оно просто ничего не делает когда не находит, возвращает предыдущий просто. боюся лезть чтото менять, хотя раз ты говоришь, сделаю :)
|
рони,
Зацени :)
/* пишем аякс-функцию */
function ajax(obj){
try{var xhr = new XMLHttpRequest()
} catch(e1){try{
xhr = new ActiveXObject("Msxml2.XMLHTTP")
} catch(e2){try{
xhr = new ActiveXObject("Microsoft.XMLHTTP")
} catch(e3){ xhr = false
}
}
}
obj.type = obj.type || "GET" ;
if(obj.type === 'POST'){
var params = '';
for(i in obj.data){
params += i + '=' + obj.data[i] + '&';
}
params = params.slice(0, -1);
xhr.open("POST", obj.url, true);
xhr.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
//xhr.setRequestHeader("Content-length", params.length);
//xhr.setRequestHeader("Connection", "close");
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200){
obj.success(this['response' + obj.dataType]);
}
else console.log( "Ajax error: " + this.statusText);
}
xhr.send(params);
}
else if(obj.type === "GET"){
var params = '?';
for(i in obj.data){
params += i + '=' + obj.data[i] + '&'
}
params = params.slice(0, -1);
params += "&nocache=" + Math.random() * 1000000
//console.log(params);
xhr.open("GET", obj.url + params, true);
xhr.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200){
obj.success(this['response' + obj.dataType]);
}
else console.log( "Ajax error: " + this.statusText)
}
xhr.send(null);
}
}
ajax({
url : './test_ajax.php',
type: 'POST',
dataType: 'Text',
data: {name: 'sash', _data_ : 'true'},
success: function(response){
document.getElementById('response').innerHTML =
response;
}
});
|
Цитата:
|
KosBeg, сенк ю :)
Теперь надо придумать как сделать чтобы можно было делать загрузку файлов как у Дениса на сайте http://incode.pro/jquery/ajax-na-pra...ka-fajlov.html contentType: false, // важно - убираем форматирование данных по умолчанию processData: false, // важно - убираем преобразование строк по умолчанию Сделать проверку на тип данных (обьехт, строка) и ещё подскаж что забыл :) |
Полный вариант, не супер но сойдёт
function ajax(obj){
try{var xhr = new XMLHttpRequest()
} catch(e1){try{
var xhr = new ActiveXObject("Msxml2.XMLHTTP")
} catch(e2){try{
var xhr = new ActiveXObject("Microsoft.XMLHTTP")
} catch(e3){var xhr = false
}
}
}
obj.type = obj.type || "GET" ;
if(obj.type === 'POST'){
xhr.open("POST", obj.url, true);
var params = '';
if (typeof obj.data === 'string')
params = obj.data;
else if(typeof obj.data === 'object'){
if(obj.contentType === false){
params = obj.data;
console.log(params);
}
else{
for(var i in obj.data){
params += i + '=' + obj.data[i] + '&';
}
params = params.slice(0, -1);
console.log(params)
xhr.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
}
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); }
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200){
obj.success(this['response' + obj.dataType]);
}
else console.log( "Ajax error: " + this.statusText);
}
xhr.send(params);
}
else if(obj.type === "GET"){
var params = '?';
if (typeof obj.data === 'string')
params += obj.data;
else if(typeof obj.data === 'object'){
for(var i in obj.data){
params += i + '=' + encodeURIComponent(obj.data[i]) + '&'
}
params = params.slice(0, -1);
params += "&nocache=" + Math.random() * 1000000;
}
xhr.open("GET", obj.url + params, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200){
obj.success(this['response' + obj.dataType]);
}
else console.log( "Ajax error: " + this.statusText)
}
xhr.send(null);
}
}
document.forms.f1.onsubmit = function(e){
e.preventDefault();
var formObj = {};
var elem = document.forms.f1;
var inputs = elem.querySelectorAll('[name]');
for(var i = 0; i < inputs.length; i++){
formObj[inputs[i].name] = inputs[i].value;
if(window.FormData) {
var formData = new FormData(document.forms.f1);
}
}
// попытка отправки
ajax({
url : './test_ajax.php',
type: 'POST',
dataType: 'Text',
contentType : false,
data:formData,//{text: document.querySelector('[name=text]').value, _data_ : 'true'},
success: function(response){
document.getElementById('response').innerHTML =
response;
}
});
}
|
Если есть свой ресурс с доступом к PHP, нарисовать простенький проксер GET запросов и дополнить либу кроссдоменным GET - Аяксом, часто востребовано. К примеру поиск картинок в гугле, или чтение RSS с ресурсов
|
Цитата:
как на бесплатный хостинг - очень даже неплохо, или например это - http://aws.amazon.com/ru/free/ Цитата:
Цитата:
|
KosBeg,
Я давно с PHP не баловался, помню только фичу, что нун трансформировать(через PHP) полученный прокси-запросом код страницы(Если он HTML) в UTF-8, если исходный в windows-1251, остальное вроде как в пяток строк. Начни с гугла, типо: - простое проксирование GET-запросов на PHP |
| Часовой пояс GMT +3, время: 15:54. |