Ответы пользователя по тегу JavaScript
  • Как отследить что пользователь покинул страницу?

    UZER2006
    @UZER2006
    Да никак вы этого не сделаете. Только «пингуя» сервак и соответственно реагируя при отсутствии активности. Конечная реализация – любая, на ваше усмотрение. Очевидно, что в таком случае пропавшее соединение так же будет считаться закрытием. Иначе никак.
    Как вариант, можно попытаться при закрытии вкладки (window.beforeClose) отправить запрос, но если не задержать закрытие, он, скорее всего, не дойдёт. А задерживание закрытие и/или вообще какие-то уведомления будут очень раздражать посетителей.
    Ответ написан
    3 комментария
  • Принцип механизма цикла в javascript for in или jquery each?

    UZER2006
    @UZER2006
    Не попадёт.
    var a = {1:'a',2:'b',3:'c',4:'d'}
    for (var name in a){ if (name==2) a[5] = 'e'; console.log('a['+name+'] = '+a[name]);}
    //a[1] = a
    //a[2] = b
    //a[3] = c
    //a[4] = d
    a
    // Object {1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
    
    Ответ написан
    Комментировать
  • Позиционирование кнопок в Ext js

    UZER2006
    @UZER2006
    Штатными средствами конструктора button не получится.
    Можно использовать bottombar панели и поместить кнопочки в 2 контейнера с нужными атрибутами.
    Вообще, посмотрите примеры Ext.NET, сам в своё время много оттуда почерпнул для разметки. Там, конечно, разметка серверная, но суть, надеюсь, будет ясна.
    Ответ написан
    2 комментария
  • Сравнение и объединение кода?

    UZER2006
    @UZER2006 Автор вопроса
    В итоге всё сделал вручную, пользуясь привычным инструментом сравнения текстов, ибо иначе нереально.
    Спасибо всем за ответы, в т.ч. за Araxis Merge.
    Ответ написан
    Комментировать
  • Можно ли создать расширение под Chrome с таким функционалом

    UZER2006
    @UZER2006
    Конечно, можно. Запретить открытие, может, и нельзя, но открытую вкладку можно потом закрыть. Всё остальное полностью реализуемо. Смотрите API для вкладок (есть слушатели на создание), и/или на обработку запросов (webRequest, например).
    Также, при необходимости, можно даже добавить в каждую страницу контент-скрипт, который добавит нужные слушатели на нужные ссылки.
    Ответ написан
  • Технологии для вебчата (платформа PHP и JS)?

    UZER2006
    @UZER2006
    В своё время сделал просто закрытый многопользовательский чат на базе Realplexor. Возможностей маловато пока (мне не хватило возможности поставить callback на внутренние события), но в целом остался доволен.
    Ответ написан
    4 комментария
  • Свой jQuery плагин?

    UZER2006
    @UZER2006
    В таком случае логично расширить глобальное пространство jQuery
    $.tooltip = function(){
    //код плагина
    }
    Применительно к коду выше, по идее, можно что-то типа вот так
    $.tooltip = function(method){
    var methods = {
    init: function( options ) {
    // А ВОТ ЭТОТ
    },
    show: function( ) {
    // ПОДХОД
    },
    hide: function( ) {
    // ПРАВИЛЬНЫЙ
    },
    update: function( content ) {
    //!!!
    }
    };

    // логика вызова метода
    if ( methods[method] ) {
    return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' ||! method ) {
    return methods.init.apply( this, arguments );
    } else {
    $.error( 'Метод с именем ' + method + ' не существует для jQuery.tooltip' );
    }
    }
    Ответ написан
    1 комментарий
  • Карта в Ext.Window.window отображается только частично

    UZER2006
    @UZER2006
    Альтернатива resize'у – метод doLayout().
    Но вообще это не нормально. Сам сейчас борюсь с похожей проблемой, когда после загрузки страницы разметка кривая, и исправляется только после ресайза окна или doLayout().
    Ответ написан
    Комментировать
  • Определение смещения блока по оси Y?

    UZER2006
    @UZER2006
    Ничего сложного. Получаем положение блока, получаем высоту рабочей области окна. Задаём соответствующий scrollTop.

    jQuery
    $('body')[0].scrollTop = $('#block').position().top-$(window).height()/2;
    

    Чистый JS
    var el = document.getElementById('#block');
    var pos = 0;
    while el(offsetTop){
    	pos += el.offsetTop;
    	el = el.offsetParent;
    }
    document.body.offsetTop = pos - window.innerHeight / 2;
    

    Если нужно, можно ещё добавить поправку на размер элемента -> приплюсовать половину его высоты.
    Получить высоту -> $('#block').height() либо document.getElementById('#block').scrollHeight
    Ответ написан
  • Проблема с распознованием положения мышки в jQuery?

    UZER2006
    @UZER2006
    Потому что у кнопки position:absolute, и её позиция считается по таймеру и с привязкой к положению родителя. offset блока меняется, но не срабатывает событие мыши, которое изменит фактический yp.
    Попробуйте, например, так
    var mouseX = 0, mouseY = 0;
    $(".side").mousemove(function(e){
       mouseY = e.clientY-19; 
    });
    
    // cache the selector
    var follower = $("#follower");
    yp = 0;
    var loop = setInterval(function(){
    
        yp += (mouseY - yp) / 6;
        follower.css({top:yp});
        
    }, 10);
    
    Ответ написан
    1 комментарий
  • Проблема с распознованием положения мышки в jQuery?

    UZER2006
    @UZER2006
    А настоящего кода нет? Сложно что-то конкретное посоветовать.
    Разбирайтесь, на каких элементах отрабатывает событие mousemove и правильно рассчитывайте положение блока. Важно знать, что вложенность элементов, особенно комбинации position:absolute и position:relative влияют на позиционирование.
    Для начала хотя бы залогайте значения положения курсора и target события. Есть большая вероятность, что всё прояснится.
    Ответ написан
  • ООП в Javascript

    UZER2006
    @UZER2006
    В первом случае вы добавляете атрибуты в новосозданный экземпляр, во втором – один из атрибутов добавлен в прототип.
    function A(){this.a = 100; this.b = 200;}
    var a = new A();
    var b = new A();
    function B(){this.a = 100;}
    B.prototype.b = 200;
    var c = new B();
    var d = new B();
    a //A {a: 100, b: 200}
    b //A {a: 100, b: 200}
    a.a = 150; b.b = 250;
    a //A {a: 150, b: 200}
    b //A {a: 100, b: 250}
    c.a = 175;
    B.prototype.b = 275;
    c //B {a: 175, b: 275}
    d //B {a: 100, b: 275}
    

    У объектов c и d свойство b унаследовано из прототипа и оно одно на все экземпляры. У экземпляров объекта B нет «личного» свойства b То есть
    a.hasOwnProperty('a') //true
    a.hasOwnProperty('b') //true
    c.hasOwnProperty('a') //true
    c.hasOwnProperty('b') //false
    
    Ответ написан
    Комментировать
  • Chrome. Разработка расширения — live edit

    UZER2006
    @UZER2006
    Смотря что вы имеете в виду. Если background или контент-скрипты – нужно обновлять. Остальное должно подхватываться. Сейчас специально проверил, изменения в коде popup-окна подхватились сразу.
    Ответ написан
    Комментировать
  • Jquery ui dialog — Кто как использует?

    UZER2006
    @UZER2006
    По-моему, вопрос немного бессмысленный. На том же JS создать любой DIV, и на него навесить диалог.
    Я в своё время обернул это в удобную функцию, которая решила большинство задач с диалогами в проекте. А позже эта функция была обёрнута в другую, для визуальных AJAX-запросов к серверу, в т.ч. на два шага (редактирование, например).
    newDialog
    var globalDialogs = {};
    /*
    	buttons
    	icontent
    	height
    	width
    	title
    	onclose
    */
    function newDialog(options){
    	options['buttons'] = options.buttons || {'OK':'OK'};
    	options['icontent'] = options.icontent || 'load';
    	options['height'] = options.height || 'auto';
    	options['width'] = options.width || 'auto';
    	options['position'] = options.position || {my:"center",at:"center",of:window};
    	options['title'] = options.title || 'Request...';
    	options['onclose'] = options.onclose || function(){};
    	var shows = ['blind', 'clip', 'drop', 'fold', 'scale', 'slide'];
    	var hides = ['blind', 'clip', 'drop', 'explode', 'fold', 'hidhlight', 'puff', 'scale', 'slide'];
    	var ndd = document.createElement('div');
    	ndd.title = options.title;
    	ndd.id = 'dialog_'+dialogC;
    	if (options.icontent == 'load'){
    		$(ndd).html('<img src="img/load.gif" />');
    		$(ndd).attr('align','center');
    	}
    	else{
    		ndd.innerHTML = options.icontent;
    	}
    	if ($('#_title',ndd).get(0)){
    		ndd.title = $('#_title',ndd).val();
    		$('#_title',ndd).remove();
    	}
    	var butts = [];
    	for (var name in options.buttons){
    		butts[butts.length] = {text:name,click:options.buttons[name]};
    		if ((name == 'OK' || name == 'Cancel' || name == 'Close' || name == 'No') && !$.isFunction(options.buttons[name])){
    			butts[butts.length-1]['click'] = function(){$(this).dialog('close');};
    			butts[butts.length-1]['id'] = 'dialog_close_btn';
    		}
    	}
    	$(ndd).dialog({
    		autoOpen: false,
    		width: options.width,
    		height: options.height,
    		position: options.position,
    		//show: shows[Math.floor(Math.random()*shows.length)],
    		//hide: hides[Math.floor(Math.random()*hides.length)],
    		beforeClose : function(){$.fx.speeds._default = 1000;},
    		close : function(){$(this).html('');$.fx.speeds._default = 400;options.onclose.call(this);},
    		buttons: butts,
    	});
    	var icon = '';
    	for (var name in options.buttons){
    		icon = '';
    		if (name == 'OK'){
    			icon = 'ui-icon-check';
    		}
    		if (name == 'Cancel' || name == 'No' || name == 'Close'){
    			icon = 'ui-icon-closethick';
    		}
    		if (name == 'Update' || name == 'Save' || name == 'Process'){
    			icon = 'ui-icon-disk';
    		}
    		$('#dialog_'+dialogC).parent().find('button:contains("'+name+'")')
    			.button('option','icons',{primary:icon});
    			//.addClass('ui-button-text-icon-primary')
    			//.removeClass('ui-button-text-only')
    			//.prepend('<span class="ui-button-icon-primary ui-icon '+icon+'"></span>');
    	}
    	$(ndd).dialog('open');
    	dialogC++;
    	return dialogC-1;
    }
    
    Ответ написан
    1 комментарий