Trello kullanıcının panosuna nasıl erişir?


936

Trello'da bir kartın üzerine gelip Ctrl+ tuşuna bastığınızda C, bu kartın URL'si panoya kopyalanır. Bunu nasıl yapıyorlar?

Anlayabildiğim kadarıyla, Flash filmi dahil değil. Bende Flashblock yüklü ve Firefox ağ sekmesi gösterileri hiçbir Flash film yüklendi. (Bu, ZeroClipboard tarafından olağan yöntemdir.)

Bu büyüyü nasıl başarıyorlar?

(Şu anda bir epiphany olduğunu düşünüyorum: Sayfadaki metni seçemezsiniz, bu yüzden görünmez bir öğeye sahip olduklarını, JavaScript kodu ile bir metin seçimi oluşturduklarını ve Ctrl+ Ctarayıcının varsayılan davranışını tetiklediğini, düğümün metin değeri.)


22
Canlı DOM'ye bakarsanız, "clipboard-container" sınıfına sahip bir div vardır. Ctrl tuşunu basılı tuttuğunuzda, bir metin alanı ile doldurulur (ve ctrl tuşunu kaldırdığınızda kaldırılır). Epifaninin doğru olduğunu varsayabilirim. Kart başına URL'yi nerede sakladıklarından tam olarak emin değilim
Ian

@Ian, evet, onaylayabilirim, tam olarak böyle çalıştı. Kazdığınız için teşekkürler! (URL'nin nerede saklandığı ile uğraşmıyorum. Pano olmadan flaş teknolojisiyle
ilgileniyordum

2
Daniel'in profilini araştırdım ve öyle görünüyor ki, o bir Trello geliştiricisi. (Coffeescript kaynağını nereden aldığını merak ettim.) Bu yüzden haksız bir avantajı var ;-) Yine de teşekkürler!
Boldewyn

1
Bu tekniğin becerikliğinden uzaklaşmak istemiyorum, oldukça zekice; ancak yardım edemem, ancak bunun en iyi ihtimalle kötü bir şekilde kamuoyuna duyurulmuş / belgelenmiş ve en kötü ihtimalle oldukça şaşırtıcı bir kullanıcı deneyimi olduğunu düşünüyorum. Verilmiş, invaziv bir şekilde sarsılmıyor (kart URL'sini yanlışlıkla kopyaladığım bir zamanı hatırlayamadığım için), ancak uzun zamandır Trello kullanıcısı olarak bunun var olduğu hakkında hiçbir fikrim yoktu.
Michael Wales

3
@MichaelWales Bu özellik 5 gün önce eklendi; hala test ediyoruz ve çalışıyor gibi görünüyorsa klavye kısayolu olarak belgelenecek.
Daniel LeCheminant

Yanıtlar:


1547

Açıklama: Trello'nun kullandığı kodu yazdım ; Aşağıdaki kod Trello'nun pano numaralarını gerçekleştirmek için kullandığı gerçek kaynak kodudur.


Aslında "kullanıcının panosuna erişmiyoruz", bunun yerine Ctrl+ tuşuna bastığında kullanışlı bir şey seçerek kullanıcıya biraz yardımcı oluyoruz C.

Anladığınız gibi geliyor; Size vurmak istediğinizde gerçeği yararlanmak Ctrl+ C, sen vurmak zorunda Ctrlilk anahtarı. Ne zaman Ctrltuşuna basıldığında seçim ayarlanır böylece, biz panodaki sonunda istediğiniz metni içeren bir textarea pop ve içindeki tüm metni seçmek Canahtar vuruldu. (Sonra Ctrlanahtar geldiğinde metin alanını gizleriz )

Özellikle, Trello bunu yapar:

TrelloClipboard = new class
  constructor: ->
    @value = ""

    $(document).keydown (e) =>
      # Only do this if there's something to be put on the clipboard, and it
      # looks like they're starting a copy shortcut
      if !@value || !(e.ctrlKey || e.metaKey)
        return

      if $(e.target).is("input:visible,textarea:visible")
        return

      # Abort if it looks like they've selected some text (maybe they're trying
      # to copy out a bit of the description or something)
      if window.getSelection?()?.toString()
        return

      if document.selection?.createRange().text
        return

      _.defer =>
        $clipboardContainer = $("#clipboard-container")
        $clipboardContainer.empty().show()
        $("<textarea id='clipboard'></textarea>")
        .val(@value)
        .appendTo($clipboardContainer)
        .focus()
        .select()

    $(document).keyup (e) ->
      if $(e.target).is("#clipboard")
        $("#clipboard-container").empty().hide()

  set: (@value) ->

DOM’de

<div id="clipboard-container"><textarea id="clipboard"></textarea></div>

Pano işleri için CSS:

#clipboard-container {
  position: fixed;
  left: 0px;
  top: 0px;
  width: 0px;
  height: 0px;
  z-index: 100;
  display: none;
  opacity: 0;
}
#clipboard {
  width: 1px;
  height: 1px;       
  padding: 0px;
}

... ve CSS bunu yapar, böylece metin geldiğinde metin alanını göremezsiniz ... ama kopyalanacak kadar "görünür".

Bir kartın üzerine geldiğinizde,

TrelloClipboard.set(cardUrl)

... böylece pano yardımcısı, Ctrltuşa basıldığında ne seçileceğini bilir .


3
Müthiş! Peki Mac OS'niz nasıl - orada Command tuşunu "dinliyor musunuz?"
Suman

28
Yapıştırılan içeriği yakalamak için de benzer bir yöntemin de işe yaradığını belirtmek gerekir
Michael Robinson

17
Bu, klavye kullanıcıları için kötü gibi görünüyor - kopyalamaya çalıştığınızda (veya başka bir pencerede açmak için ctrl + tıklama veya aramak için Ctrl + F vb.), Odağınız ilgisiz bir yere taşınır.
Adam A

2
+1. Bu cevapta çok güzel şeyler oluyor. Aslında kaynak kodunu paylaşmanızı sevdim. Ama akıllı olduğunu düşündüğüm ctrl + c işlevselliğini sağlamak için kullanılan sürecin gerçek açıklamasıydı. Kanımca ctrl ve c tuşlarına aynı anda basılamadığından yararlanmak ctrl'ye basıldığında c'ye hazırlanmaktan çok zekiydi. Bu yaklaşımı gerçekten beğendim.
Travis J

8
Orijinali eğimli ise js'ye çevirmek için js2coffee.org'u kullanmaktan çekinmeyin .
Alexandr Kurilin

79

Aslında tam olarak bunu yapan bir Chrome uzantısı oluşturdum ve tüm web sayfaları için. Kaynak kodu GitHub'da .

Trello'nun yaklaşımıyla üç hata buluyorum, biliyorum ki kendimle yüzleştim :)

Kopya şu senaryolarda çalışmaz:

  1. Daha önce Ctrlbir bağlantıya bastıktan sonra fareyle üzerine geldiyseniz ve isabet ederseniz C, kopya çalışmaz.
  2. İmleciniz sayfadaki başka bir metin alanındaysa, kopya çalışmaz.
  3. İmleciniz adres çubuğundaysa, kopya çalışmaz.

Hep gizli bir açıklığa sahip, yerine bir kullanıcı isabet oluşturarak 1. çözüldü Ctrl/ Cmd.

Sıfır uzunluk seçimini geçici olarak temizleyerek, düzeltme konumu konumunu kaydederek, kopyalama yaparak ve düzeltme konumu geri yükleyerek # 2'yi çözdüm.

Henüz # 3 için bir düzeltme bulamadım :) (Bilgi için GitHub projemdeki açık sorunu kontrol edin).


10
Aslında bunu Trello ile aynı şekilde yaptınız. Tatlı böyle şeyler yakınsama
Thomas Ahle

@ThomasAhle, Ne demek istiyorsun?
Pacerier

7
@Pacerier, Thomas'ın Convergent Evolution - "... farklı soy türlerinde benzer özelliklerin bağımsız evrimi" ni ima ettiğini varsayıyorum
yoniLavi

kutsal inek bu konu hakkında yeni bir sohbet açabilirsin
carkod

20

Raincoat'ın ( GitHub'a bağlantı ) kodunun yardımıyla panoya düz JavaScript ile erişen çalışan bir sürüm almayı başardım.

function TrelloClipboard() {
    var me = this;

    var utils = {
        nodeName: function (node, name) {
            return !!(node.nodeName.toLowerCase() === name)
        }
    }
    var textareaId = 'simulate-trello-clipboard',
        containerId = textareaId + '-container',
        container, textarea

    var createTextarea = function () {
        container = document.querySelector('#' + containerId)
        if (!container) {
            container = document.createElement('div')
            container.id = containerId
            container.setAttribute('style', [, 'position: fixed;', 'left: 0px;', 'top: 0px;', 'width: 0px;', 'height: 0px;', 'z-index: 100;', 'opacity: 0;'].join(''))
            document.body.appendChild(container)
        }
        container.style.display = 'block'
        textarea = document.createElement('textarea')
        textarea.setAttribute('style', [, 'width: 1px;', 'height: 1px;', 'padding: 0px;'].join(''))
        textarea.id = textareaId
        container.innerHTML = ''
        container.appendChild(textarea)

        textarea.appendChild(document.createTextNode(me.value))
        textarea.focus()
        textarea.select()
    }

    var keyDownMonitor = function (e) {
        var code = e.keyCode || e.which;
        if (!(e.ctrlKey || e.metaKey)) {
            return
        }
        var target = e.target
        if (utils.nodeName(target, 'textarea') || utils.nodeName(target, 'input')) {
            return
        }
        if (window.getSelection && window.getSelection() && window.getSelection().toString()) {
            return
        }
        if (document.selection && document.selection.createRange().text) {
            return
        }
        setTimeout(createTextarea, 0)
    }

    var keyUpMonitor = function (e) {
        var code = e.keyCode || e.which;
        if (e.target.id !== textareaId || code !== 67) {
            return
        }
        container.style.display = 'none'
    }

    document.addEventListener('keydown', keyDownMonitor)
    document.addEventListener('keyup', keyUpMonitor)
}

TrelloClipboard.prototype.setValue = function (value) {
    this.value = value;
}

var clip = new TrelloClipboard();
clip.setValue("test");

Tek sorun, bu sürümün yalnızca Chrome ile çalışmasıdır. Trello platformu tüm tarayıcıları destekler. Neyi kaçırdım?

VadimIvanov'a teşekkür etti.

Çalışan bir örneğe bakın: http://jsfiddle.net/AGEf7/


@ don41382 Safari'de düzgün çalışmıyor (en azından Mac sürümü). Uygun altında, yani kopyalar, ama cmd + C'yi iki kez itmeniz gerekir.
Vadim Ivanov

@VadimIvanov Doğru! Birisi nedenini biliyor mu?
Felix

1
@ don41382 Nedenini tam olarak bilmiyorum, ama bir çözüm buldum. Küçük bir hata var, onKeyDown ilk ifade if (! (E.ctrlKey || e.metaKey)) {return; } Bu, basılan metaKey'de kopya için textarea hazırlamamız gerektiği anlamına gelir (trello'dan gelen çocuklar bir numara yaptı). Bu kod trello.com gist.github.com/fustic/10870311
Vadim Ivanov

@VadimIvanov Teşekkürler. Yukarıda düzeltirim.
Felix

1
el.innerTextTanımlanmamış olduğu için FF 33.1'de çalışmıyordu , bu yüzden daha fazla tarayıcılar arası uyumluluk için clipboard()işlevin son satırını olarak değiştirdim clip.setValue(el.innerText || el.textContent);. bağlantı: jsfiddle.net/AGEf7/31
RevanProdigalKnight

7

Daniel LeCheminant'ın kodu CoffeeScript'ten JavaScript'e ( js2coffee ) dönüştürüldükten sonra benim için çalışmadı . Hatta bombalamaya devam etti _.defer().

Bunun jQuery ertelemeleri ile ilgili bir şey olduğunu varsaydım, bu yüzden onu değiştirdim $.Deferred()ve şimdi çalışıyor. Bunu jQuery 2.1.1 ile Internet Explorer 11, Firefox 35 ve Chrome 39'da test ettim. Kullanım Daniel'in gönderisinde açıklananla aynıdır.

var TrelloClipboard;

TrelloClipboard = new ((function () {
    function _Class() {
        this.value = "";
        $(document).keydown((function (_this) {
            return function (e) {
                var _ref, _ref1;
                if (!_this.value || !(e.ctrlKey || e.metaKey)) {
                    return;
                }
                if ($(e.target).is("input:visible,textarea:visible")) {
                    return;
                }
                if (typeof window.getSelection === "function" ? (_ref = window.getSelection()) != null ? _ref.toString() : void 0 : void 0) {
                    return;
                }
                if ((_ref1 = document.selection) != null ? _ref1.createRange().text : void 0) {
                    return;
                }
                return $.Deferred(function () {
                    var $clipboardContainer;
                    $clipboardContainer = $("#clipboard-container");
                    $clipboardContainer.empty().show();
                    return $("<textarea id='clipboard'></textarea>").val(_this.value).appendTo($clipboardContainer).focus().select();
                });
            };
        })(this));

        $(document).keyup(function (e) {
            if ($(e.target).is("#clipboard")) {
                return $("#clipboard-container").empty().hide();
            }
        });
    }

    _Class.prototype.set = function (value) {
        this.value = value;
    };

    return _Class;

})());

5

URL'yi kısalttığınızda http://goo.gl adresinde çok benzer bir şey görülebilir .

CTRL-CKopyalamak için araç ipucu ile programlı olarak odaklanan salt okunur bir giriş öğesi vardır .

Bu kısayola bastığınızda, giriş içeriği etkin bir şekilde panoya girer. Gerçekten hoş :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.