Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ЧаВО - часто задаваемые вопросы (faq) (https://javascript.ru/forum/misc/9459-chavo-chasto-zadavaemye-voprosy-faq.html)

sergiocharm 23.06.2012 17:18

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

зы: поверхностные знание мега инструмента ЯВА

Gozar 02.07.2012 14:09

sergiocharm,
Вы чем-то противоестественным занимаетесь. Ваши вопросы не подходят для чаво. т.к. они не часто задаваемые.

melky 02.07.2012 16:40

sergiocharm, эта тема не для вопросов,а для ответов. для вопросов создавайте новую тему.

melky 31.07.2012 16:30

Насчёт "кроссдоменного AJAX" в JavaScript*.

* жёлтовато. на самом деле имелось в виду получить данные с другого сайта, имея на руках только JS.

Вопрос :

Как мне забрать контент с другого сайта? Так не работает.
$.ajax({
    url: 'http://vk.com',
    success: function(data){
        alert(data); // <-- WTF
    }
});

Ответ :

И не будет работать. Для получения контента с других сайтов придумана целая куча способов, но сейчас я остановлюсь на одном, который основан на применении Яху Труб. Эту штуку я много раз упоминал, и это даже есть и на хабре.
Как решить?

Вообще, стоило бы почитать, зачем нужна эта технология (предназначена она вообще не для того, чтобы контент тырить :)), но это уже как-нибудь сами. Итак, сейчас получим контент сайта javascript.ru. Простите, обьяснять ничего не хочу. Если спросит кто-нибудь, как это работает, напишу сюда.
<html>
<head>
    <base href="http://javascript.ru"> <!-- для корректного поедания картинок -->
</head>
<body>
<h1>ответ будет здесь</h1>
<script>
var query = 'select * from html where url="http://javascript.ru/" and xpath="*"'
var url = 'http://query.yahooapis.com/v1/public/yql?q='+encodeURI(query)+'&format=xml&callback=callback';

document.body.appendChild(document.createElement('script')).src = url;

function callback(data) {
    document.body.innerHTML += data.results[0];
}
</script>
</body>
</html>


Deff 31.07.2012 16:52

мон конешн обойтись и без yahooapis и закидывать скрипты и аякс на сам ресурс :write:

melky 01.08.2012 23:25

FAILED.

Deff 01.08.2012 23:34

Цитата:

Сообщение от melky
максимум, опишу алгоритм :

:write:
А так - не проще ?
<div id="container">
    <div id="target">FOOBAR-0</div>
    <div id="target">FOOBAR</div>
    <div id="target">FOOBAR</div>
</div>

<script type="text/javascript">
var elements = container.querySelectorAll("div[id='target']"); // <---- теперь всё, как по маслу
alert(elements[0].innerHTML)
</script>

melky 01.08.2012 23:37

Цитата:

Сообщение от Deff (Сообщение 193808)
:write:
А так - не проще ?
container.querySelectorAll("div[id='target']");

ну теперь всё, что описано в алгоритме, выполняется в 1 строку. какая разница то ?) всё равно ID должен быть один на странице, в этом суть поста.

devote 02.08.2012 00:36

Цитата:

Сообщение от melky
var elements = container.querySelectorAll("#target"); // <---- вот тут лабуда

какая тут нахрен лабуда? melky, ты хоть тестил перед тем как писать что это лабуда? querySelectorAll по йдишникам, выдает все элементы с таким айдишником, будь то их хоть сотню. метод querySelectorAll работает не так как getElementById для querySelectorAll атрибут ID простой атрибут, и он выберет все элементы по указанному правилу CSS, то есть найдет элементы с атрибутом ID который равен указанному значению:
<div id="container">
    <div id="target">FOOBAR</div>
    <div id="target">FOOBAR</div>
    <div id="target">FOOBAR</div>
</div>
<script>
var container = document.getElementById("container");
var elements = container.querySelectorAll("#target"); // <---- вот тут нихрена не лабуда
alert( elements.length ); // 3 элемента, без какой либо лабуды
</script>

SHOCKj 02.08.2012 20:00

Подскажите плиз, как сделать в textbox'e multiline=true, то есть чтобы можно было отступы делать в текстовом поле? такого свойства я не нашел в джаве, но такое было в c#

Dim@ 02.08.2012 20:07

SHOCKj,
<style type="text/css">
.text{
 padding-left:10px;
}
</style>
<input type="text" class="text">
:blink:

Deff 24.08.2012 20:31

Как Подключить загружаемый скрипт после подгрузки DOM
<html>
<body>
<script type="text/javascript">
document.body.onload = function() {  //ondomready
 var script=document.createElement('script');
 script.src='http://hostjs-mybb2011.narod.ru/js/alert_tst.js';
 document.body.appendChild(script)
}
</script>
</body>
</html>

FINoM 22.11.2012 04:48

Очень простой приём "эмуляции" forEach
Может быть кому-то будет интересно.

Лично я использую forEach вместо for не только благодаря скрытию переменных от верхней области видимости, но и благодаря возможности именовать текущий элемент массива:
items.forEach( function( *!*item*/!*, i ){
   //...
});

вместо
for( var i = 0; i < items.length; i++ ) {
   //...
}


Согласитесь, item выглядит красивее, нежели items[i], особенно если использовать цикл в цикле: items[i][j][k].

Но, иногда, for лучше подходит для решения задачи: во-первых он в два раза быстрее (если использовать IE fallback, то и более, чем в два раза), что важно в сложных проектах, во-вторых можно менять массив как пожелаешь, так как количество итераций динамично и зависит от текущей длины массива, а не той, которая была в начале цикла.
items.splice( i--, 1 ); // такое не прокатит в forEach


Простое, но несколько громоздкое решение именования текущего элемента итерации:
for( var i = 0, item = items[ 0 ]; i < items.length; item = items[ ++i ] ) {
   //...
}
Теперь item === items[0].

tenshi 22.11.2012 22:39

for( var item= $i( items ); item(); ){
    console.log( item.value )
}

FINoM 22.11.2012 22:42

tenshi, понял, что ты имеешь в виду. Да, круто. Но не более производительно, чем forEach. И да, как ты предлагаешь менять массив?

tenshi 22.11.2012 22:47

а не надо менять массив во время итерирования - это и с for может плохо кончиться.

FINoM 22.11.2012 22:49

Цитата:

Сообщение от tenshi
это и с for может плохо кончиться.

Вообще, если ты пишешь что-либо, это может плохо кончиться. Модифицировать массив в цикле — нормальная практика, требующая просто немного внимания.

tenshi 22.11.2012 22:50

for( var item= $i( items ); item.next(); ){ // создали итератор и пошли итерировать
    console.log( item.key(), item.val() ) // получили ключ и значение
    item.val( item.val() + 1 ) // увеличили значение
}

tenshi 22.11.2012 22:51

Цитата:

Сообщение от FINoM (Сообщение 217334)
Вообще, если ты пишешь что-либо, это может плохо кончиться. Модифицировать массив в цикле — нормальная практика, требующая просто немного внимания.

это опасная и как правило не нужная практика. контрпример в студию)

FINoM 22.11.2012 22:56

Цитата:

Сообщение от tenshi
не нужная практика

Угу, как и программирование в целом.
Цитата:

Сообщение от tenshi
контрпример в студию

Забей, оно тебе точно не понадобится.

tenshi 22.11.2012 22:57

так и запишем - проблему высосал из пальца)

tenshi 22.11.2012 23:02

for( var item= $i( items ); item.next(); ){
    item.owner().push( 'foo' ) // добавили элемент в список
    item.owner( item.owner().concat([ 'foo', 'bar' ]) ) // добавили список в список
    item.key( item.key() - 1 ) ) // сдвинули указатель на предыдущий элемент
    // и ушли в бесконечный цикл)
}

FINoM 22.11.2012 23:02

У меня не настолько уж проблемные пальцы. А тебе просто советую побольше поработать, а потом брать дядек на айда с примерами в студии. Есть тут у нас еще один Якубович, Ливандериамариумом зовется, тоже любитель "покажи да докажи".

FINoM 22.11.2012 23:04

Цитата:

Сообщение от tenshi
...
item.owner().push( 'foo' ) // добавили элемент в список
...

Фу фу фу, бросай ты эту затею.

tenshi 22.11.2012 23:13

ещё один спесивый юнец) тоже из яндекса?

devote 23.11.2012 01:42

Цитата:

Сообщение от tenshi
контрпример в студию)

Цитата:

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

Цитата:

Сообщение от tenshi
ещё один спесивый юнец) тоже из яндекса?

вот тебе контр пример: https://github.com/devote/QSA/blob/master/qsa.js хотя то как ты тут общаешься, боюсь программирование в JS на более низком уровне, для тебя темный лес... Что же поделаешь, судьба всех джукверистов.

tenshi 23.11.2012 18:11

> вот тебе контр пример: https://github.com/devote/QSA/blob/master/qsa.js

какой пиздец.. и где там _необходимо_ модифицировать итерируемый массив?

вот пример более грамотной архитектуры для выборки по селектору
function jpath( path ){ // jpath 3a1
    var cache= jpath.cache
    var result= cache[ path ]
    if( result ) return result
    
    var types= jpath.types
    var processors= []
    path.replace
    (   /([.])([^.\s]*)/g
    ,   function( str, type, name ){
            processors.unshift( types[ type ]( name ) )
        }
    )
    
    return cache[ path ]= function( ){
        var list= [].slice.call( arguments )
        for( var i= processors.length; --i >= 0 && list.length ; ){
            list= processors[ i ]( list )
        }
        return list
    }
}
jpath.cache= {}
jpath.types= {}
    
jpath.types[ '.' ]= function( name ){
    if( !name ) return function( list ){
        var result= []
        list.forEach( function( value ){
            for( var name in value ){
                var val= value[ name ]
                if( val == null ) continue
                result.push( val )
            }
        })
        return result
    }
    
    return function( list ){
        if( list.length === 1 ){
            value= list[ 0 ]
            if( value == null ) return []
            return[ value[ name ] ]
        }
        
        var result= []
        list.forEach( function( value ){
            var val= value[ name ]
            if( val == null ) return
            result.push( val )
        })
        return result
    }
}

console.log( jpath( '. .a .length' )( [ 123, { a: "12" }, 0 ] ) )



> хотя то как ты тут общаешься, боюсь программирование в JS на более низком уровне, для тебя темный лес... Что же поделаешь, судьба всех джукверистов.

да тут куда не плюнь попадёшь в какого-нибудь низкоуровневого специалиста :lol:

devote 23.11.2012 20:26

Цитата:

Сообщение от tenshi
вот пример более грамотной архитектуры для выборки по селектору

я вижу лишь говнокод

tenshi 23.11.2012 20:51

Цитата:

Сообщение от devote (Сообщение 217505)
я вижу лишь говнокод

по каким признакам ты учуял тут говнокод?

melky 23.11.2012 23:10

Цитата:

Сообщение от tenshi
46 var result= []
47 list.forEach( function( value ){
48 var val= value[ name ]
49 if( val == null ) return
50 result.push( val )
51 })
52 return result
53 }

return list.filter(function (val) {
    return !!val[name];
});

tenshi 23.11.2012 23:45

Цитата:

Сообщение от melky (Сообщение 217514)
return list.filter(function (val) {
    return !!val[name];
});

тогда уж так:
return list.map(function (value) {
    return value[name]
}).filter(function (val) {
    return !!val;
});

но как-то это криво)

melky 23.11.2012 23:51

Цитата:

Сообщение от tenshi
тогда уж так:

зачем??

tenshi 24.11.2012 00:28

у тебя результат не правильный потому что

FINoM 24.11.2012 03:57

Кормить Тенши больше не хочется.

У меня вопрос, для которого не хочется создавать отдельную тему и который уже когда-то обсуждался: для чего создан void в JS? Я не думаю, что у создателей языка просто зачесалась левая пятка и они решили добавить альтернативу undefined. Я вижу только одну возможную причину: использование void там, где undefined может быть перезаписана. Но, все равно, это мне кажется неадекватным костылем, иначе перезапись undefined могли бы запретить, как и перезапись NaN, Infinity и др.

tenshi 24.11.2012 12:57

> Кормить Тенши больше не хочется.

слив засчитан)

> для чего создан void в JS?

void function(){
    // ...
}()

> иначе перезапись undefined могли бы запретить

думаю тогда и undefined никакого не было. люди просто юзали эту неопределённую переменную

melky 24.11.2012 14:36

Цитата:

Сообщение от tenshi
у тебя результат не правильный потому что

поподробнее. в чём ошибка?

tenshi 24.11.2012 14:38

Цитата:

Сообщение от melky (Сообщение 217590)
поподробнее. в чём ошибка?

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

melky 24.11.2012 14:44

Цитата:

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

действительно

Цитата:

Сообщение от tenshi (Сообщение 217518)
тогда уж так:
return list.map(function (value) {
    return value[name]
}).filter(function (val) {
    return !!val;
});

но как-то это криво)

тогда так :
return list.reduce(function (data, value) {
    value[name] && data.push(value[name]);
    return data;
}, []);

tenshi 24.11.2012 15:47

reduce в данном случае имеет более сложную семантику, а так, да, можно и его. но я бы предпочёл всё же итераторы, чтобы иметь полный контроль над потоком исполнения.
к тому же, в более других случаях нужно обеспечивать ещё и уникальность значений в результирующем массиве, а для этого всё-равно нужно снаружи создавать хэшик для быстрого определения наличия значения.

FINoM 24.11.2012 19:30

Цитата:

Сообщение от tenshi
void function(){
    // ...
}()

Я понимаю, что ты взял первый попавшийся пример применения, но ты наверно не понял меня: для чего создан void? Мгновенный запуск анонимных функций можно реализовать еще несколькими методами.


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