Squeak.ru - шаблоны программирования

Перехват переходов по ссылкам в Famo.us

Скажем, есть поверхность, объявленная с помощью Famo.us, содержащая разметку:

this.mySurface = new Surface({
    size : this.options.targetSize,
    content : '<a href="http://famo.us">This is a link</a>',
});

Есть ли (простой) способ перехватить событие щелчка?

Бонус: помимо перехвата щелчка, как передать событие щелчка, чтобы обработчик по умолчанию также выполнял свою работу?


  • Что вы пытаетесь с этим делать? Что вы имеете в виду под бонусом? Если вы поместите this.mySurface.on ('click', function () {}); он фиксирует событие щелчка, позволяя вам действовать в соответствии с ним, и ссылка также все еще используется. Немного подробнее о том, что вы пытаетесь сделать, и я уверен, что смогу вам помочь. 12.08.2014
  • Поверхность содержит стандартную разметку со ссылками. Я хотел бы иметь возможность открывать ссылку на новой поверхности на странице вместо того, чтобы браузер обрабатывал ее, открывая в новом окне / вкладке. 12.08.2014

Ответы:


1

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

Вот полный код: Пример на jsFiddle

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

this.mySurface.clickNullifier = function (e) {
    if (e.target && e.target.nodeName == 'A' && e.target.href) {
        this.mySurface.emit('href-clicked', { data: { href: e.target.href } })
        return false;
    }
}.bind(this);

this.mySurface.on('deploy', function () {
    // sets up the click function on the surface DOM object
    this._currentTarget.onclick = this.clickNullifier;
});

Теперь, когда отслеживаются поверхностные щелчки, мы будем фиксировать любые перехваченные щелчки и загружать их в iFrame, или если локальные ссылки загружают их, используя утилиту loadURL в известном.

this.mySurface.on('href-clicked', function (event) {
    console.log(event.data);
    // handle your code for the iframe
    // not always doable in the case of 'X-Frame-Options' to 'SAMEORIGIN'
    loadIframe.call(this, event.data.href);

    // or loadURL like here. Needs CORS open on the href server if cross origin
    //Utility.loadURL(event.data.href, loadLink.bind(this));
}.bind(this));

function loadIframe(content) {
    this.backSurface.setContent('<iframe src="' + content + '" frameborder="0" height="100%" width="100%"></iframe>');
};

Бонус: в примере ссылки выше вы увидите, что событие click по-прежнему запускается на поверхности. В этом можно убедиться, посмотрев журнал консоли.

13.08.2014
  • Отлично. Спасибо Talves! 15.08.2014
  • Добро пожаловать :) Я уверен, что со временем мне это понадобится. 15.08.2014

  • 2

    Вы не можете открыть новую ссылку непосредственно на поверхности, но вы можете добавить что-то вроде IFrameSurface: Famo.us IframeSurface < / а>

    Как подразумевается aintnorest, вы, скорее всего, захотите добавить обработчик событий для щелчка по поверхности:

    this.mySurface.on('click', function(e) {
        // Bonus: on click do the standard redirect on main window
        // or redirect of iFrame control
        window.location = "http://famo.us";
    });
    

    а затем вместо href в контенте вам просто нужен текст «Это ссылка», поскольку обработчик предоставляет обычно ожидаемую логику, но через перехват.

    Если вам по какой-то причине нужно оставить их как «ссылки», вы можете попробовать добавить хеш в href, чтобы избежать фактического перехода через поведение по умолчанию.

    В качестве альтернативы, поскольку мы все равно работаем с javascript, вы можете попробовать что-нибудь вроде:

    использовать javascript для перехвата всех переходов по ссылкам на документы

    12.08.2014
  • Спасибо. Это работает для одной ссылки, но не будет работать, если содержимое разметки содержит несколько (разных) ссылок. +1 для потока перехвата. 13.08.2014
  • Новые материалы

    День 76/100 Книга
    День 76/100 Книга Обучение — это непрерывный процесс с ресурсами, широко используемыми людьми, которые признают сложный путь достижения успешной цели. Хотя поначалу это может показаться..

    Gmail Smart Compose: умный способ написать электронное письмо
    Gmail означает почту Google, это бесплатная служба электронной почты, предоставляемая Google по всему миру. Google официально запустил Gmail в 2004 году, и в настоящее время этой услугой..

    API следующего поколения: gRPC n Javascript
    gRPC - быстро развивающаяся технология, которая потенциально может заменить протокол HTTP. Это быстрее, чем традиционные HTTP-вызовы, потому что он отправляет данные в двоичном формате, а не в..

    Ускоренный курс по жадным алгоритмам
    Дай мне, дай мне, дай мне Аудитория Эта статья предназначена для инженеров, достаточно хорошо разбирающихся в программировании, структурах данных и алгоритмах. Он в основном основан на..

    Изучайте Java (Урок 2: Комментарии)
    Как и зачем использовать комментарии в java с примерами Введение: Комментарии — это строки текста в программе Java, которые игнорируются компилятором и используются для добавления..

    Async Await в Swift: легкое управление параллелизмом
    Введение в запуск асинхронного кода Асинхронный код выполняет несколько операций одновременно. Параллелизм необходим при выполнении тяжелых вычислений или сетевых запросов. Однако это может..

    Очистить файлы Program .cache в Ubuntu 20.10
    Очистите кеш за несколько простых шагов! GNU / Linux реализовал эффективное управление хранилищем для своих пользователей. Но заметили ли вы, что в вашей системе Linux заканчивается место,..