Сделайте псевдоним к document.getElementById в JavaScript

Я попробовал решение, предоставленное @naktinis, но результат оказался не таким, как я ожидал. Чего я сам хотел добиться в качестве адаптера, в который можно добавлять новые элементы вверху (индекс 0). Однако, учитывая данное решение, новые элементы действительно были добавлены сверху, но только в КОНЕЦ MatrixCursor. Другими словами, когда я динамически добавлял строки в MatrixCursor «extras», я получал что-то вроде этого: "строка 2

  • " дополнительные "строки 3
  • " курсор "строка 1
  • " курсор "строка 2
  • «курсор», строка 3.
    • Однако то, чего я действительно хотел добиться, было примерно так:

      • «дополнительные» строки 3
      • «дополнительные» строки 2
      • «дополнительная» строка 1
      • «курсор» строка 1
      • «курсор» строка 2
      • «курсор», строка 3.

      Другими словами, самые последние элементы входят вверху (индекс 0).

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

      private class CollectionAdapter extends ArrayAdapter<String> {
      
        /**
         * This is the position which getItem uses to decide whether to fetch data from the
         * DB cursor or directly from the Adapter's underlying array. Specifically, any item
         * at a position lower than this offset has been added to the top of the adapter
         * dynamically.
         */
        private int mCursorOffset;
      
        /**
         * This is a SQLite cursor returned by a call to db.query(...).
         */
        private Cursor mCursor;
      
        /**
         * This stores the initial result returned by cursor.getCount().
         */
        private int mCachedCursorCount;
      
        public Adapter(Context context, Cursor cursor) {
          super(context, R.layout.collection_item);
          mCursor = cursor;
          mCursorOffset = 0;
          mCachedCursorCount = -1;
        }
      
        public void add(String item) {
          insert(item, 0);
          mCursorOffset = mCursorOffset + 1;
          notifyDataSetChanged();
        }
      
        @Override
        public String getItem(int position) {
          // return the item directly from underlying array if it was added dynamically.
          if (position < mCursorOffset) {
            return super.getItem(position);
          }
      
          // try to load a row from the cursor.
          if (!mCursor.moveToPosition(position - mCursorOffset)) {
            Log.d(TAG, "Failed to move cursor to position " + (position - mCursorOffset));
            return null; // this shouldn't happen.
          }
          return mCursor.getString(INDEX_COLLECTION_DATA);   
        }
      
        @Override
        public int getCount() {
          if (mCachedCursorCount == -1) {
            mCachedCursorCount = mCursor.getCount();
          }
          return mCursorOffset + mCachedCursorCount;
        }
      }
      
    11
    задан Gavin Miller 12 August 2009 в 15:18
    поделиться

    5 ответов

    Возможно, самый простой/короткий путь:

    function $(id) { return document.getElementById(id); };
    
    10
    ответ дан 3 December 2019 в 02:53
    поделиться

    Вот кое-что, что я использую в моей собственной библиотеке. DOM - это класс, а $ - это функция, которая является сокращенной реализацией функции getElementById :

    function DOM()
    {
      this.$ = function(elementIDs)
      {
        var el;
    
        // If an array of element names is passed.
        if (arguments.length > 1) 
        {
          var elements = [];
          var length = arguments.length;
          for (var i = 0; i < length; i++)
          {
            // Call this function recursively for each passed parameter.
            elements.push(this.$(arguments[i]));
          }
          return elements;
        }
    
        // If a single element name is passed.
        if (typeof(elementIDs) == "string")
        {
          el = document.getElementById(elementIDs);
        }
        return el;
      }
    }
    

    Использование:

    var el = new DOM().$("elementID");
    

    Вы можете присвоить ей псевдоним элемент окна верхнего уровня.

    3
    ответ дан 3 December 2019 в 02:53
    поделиться

    Когда вы видели функцию $ (), вероятно, это была какая-то библиотека, такая как jQuery или Prototype. Функция $ не является псевдонимом для document.getElementById, а является оболочкой, которая расширяет функциональные возможности функции.

    Чтобы создать свою собственную оболочку, вы можете написать функцию «псевдоним»:

    var alias = document.getElemenyById;
    

    или

    function alias(id) { return document.getElementById(id); }
    

    Но на самом деле, я бы использовал одну из доступных библиотек, например jQuery или Prototype.

    -1
    ответ дан 3 December 2019 в 02:53
    поделиться
    function $( s ) {
        return document.getElementById( s ) ? document.getElementById( s ) : "";
    }
    
    $( "myId" );
    

    Предполагается, что вы хотите использовать только функцию доллара (селектор) для получения идентификатора. Я не проверял это, но он должен работать.

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

    0
    ответ дан 3 December 2019 в 02:53
    поделиться

    facebook's connect-js делает следующее в src/core/prelude.js:

    if (!window.FB) {
      FB = {
        // ...
        $: function(id) {
          return document.getElementById(id);
        }
        // ...
      }
    }
    

    Затем, чтобы использовать его, они делают:

    FB.$('name-of-id');
    

    Начальный блок создает глобальный объект FB. Они используют этот объект, FB, в качестве пространства имен и определяют в нем все свои объекты, свойства и функции. Таким образом, он будет работать с другим кодом JavaScript до тех пор, пока этот другой код не использует глобальный объект FB.

    0
    ответ дан 3 December 2019 в 02:53
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: