Office
Είσοδος

Επιλογές περιήγησης για το SharePoint Online

Σε αυτό το άρθρο περιγράφει τον τρόπο για να βελτιώσετε τους χρόνους φόρτωσης σελίδων για το SharePoint Online με χρήση διαχειριζόμενη περιήγηση ή αναζήτηση βάσει περιήγησης.

Σημείωση:  Θέλουμε να σας παρέχουμε το πιο πρόσφατο περιεχόμενο βοήθειας στη γλώσσα σας όσο πιο σύντομα γίνεται. Αυτή η σελίδα έχω μεταφραστεί μέσω αυτοματοποιημένης διαδικασίας και ενδεχομένως να περιέχει γραμματικά λάθη και ανακρίβειες. Ο σκοπός μας είναι αυτό το περιεχόμενο να σας φανεί χρήσιμο. Μπορείτε να μας ενημερώσετε στο κάτω μέρος αυτής της σελίδας εάν οι πληροφορίες σάς φάνηκαν χρήσιμες; Εδώ θα βρείτε το άρθρο στα Αγγλικά , για να το συμβουλεύεστε εύκολα.

Καθολική περιήγηση και τα ερωτήματα που απαιτείται για τη δημιουργία της δομής περιήγησης μπορούν να κάνουν τις σελίδες σας φόρτωση περισσότερων αργά στο SharePoint Online. Αυτό συμβαίνει επειδή κάθε ένα από αυτά τα ερωτήματα στέλνει την αίτηση άλλου με τον SQL server. Για κάθε τοποθεσία και δευτερεύουσας τοποθεσίας που έχετε, περισσότερες αιτήματα με τον SQL server. Αυτό το ζήτημα επηρεάζει επίσης τις κύριες σελίδες. Αυτό σημαίνει ότι επίσης επηρεάζεται καθολική περιήγηση.

Ορισμένες τοποθεσίες του SharePoint απαιτεί μεγάλη και σύνθετες δομές. Χρησιμοποιώντας την πλοήγηση δομικά εκτός του πλαισίου, η οποία χρησιμοποιεί περιεχόμενο από το ερώτημα, μπορεί να έχει ως αποτέλεσμα αργή χρόνους φόρτωσης λόγω πολλά επίπεδα τοποθεσίας. Κάθε ένα από τα επίπεδα δευτερευουσών τοποθεσιών δημιουργεί επίσης ένα άλλο ερώτημα.

Υπάρχουν δύο επιλογές κύρια περιήγηση εκτός του πλαισίου στο SharePoint, καθώς και μια τρίτη, προσέγγιση προσαρμοσμένο, βάσει αναζήτησης. Κάθε επιλογή έχει πλεονεκτήματα και μειονεκτήματα όπως περιγράφεται στον παρακάτω πίνακα.

Δομική περιήγηση

Διαχειριζόμενη περιήγηση

Περιήγηση βάσει αναζήτησης

Οι επαγγελματίες τεχνολογιών πληροφορικής:

  • Μπορείτε να ρυθμίσετε τις παραμέτρους

  • Περικοπές ασφαλείας

  • Ενημερώνει αυτόματα καθώς προστίθενται τοποθεσίες

Οι επαγγελματίες τεχνολογιών πληροφορικής:

  • Μπορείτε να διατηρήσετε

Οι επαγγελματίες τεχνολογιών πληροφορικής:

  • Περικοπές ασφαλείας

  • Ενημερώνει αυτόματα καθώς προστίθενται τοποθεσίες

  • Γρήγορα τη φόρτωση δομής πλοήγησης χρόνο και τοπικά στο cache

Τα μειονεκτήματα:

  • Μπορεί να εκτελέσει ακατάλληλα με δομή σύνθετες τοποθεσίας

Τα μειονεκτήματα:

  • Δεν ενημερώνεται αυτόματα ώστε να αντικατοπτρίζει δομή τοποθεσίας

Τα μειονεκτήματα:

  • Δεν υπάρχει δυνατότητα εύκολα σειρά τοποθεσίες

  • Απαιτεί προσαρμογή της κύριας σελίδας (τεχνικές δεξιότητες που απαιτούνται)

Εάν έχετε μια τοποθεσία με πολλές δευτερεύουσες τοποθεσίες και χρησιμοποιείτε δομική περιήγηση, ενδέχεται επιβραδύνει σας φόρτωση της σελίδας προς τα κάτω σημαντικά. Η πλέον κατάλληλη επιλογή για την τοποθεσία σας θα εξαρτώνται από τις απαιτήσεις σας τοποθεσία και από την τεχνική ικανότητα. Εάν είστε εξοικειωμένοι με τη χρήση μιας προσαρμοσμένης κύριας σελίδας και έχουν τη δυνατότητα ορισμένες στον οργανισμό για να διατηρήσετε τις αλλαγές που μπορεί να προκύψουν σε της προεπιλεγμένης κύριας σελίδας για το SharePoint Online, στη συνέχεια, στην επιλογή βάσει αναζήτησης θα δημιουργήσουν την καλύτερη εμπειρία χρήστη. Εάν θέλετε μια απλή αρχής μέση μεταξύ της εκτός του πλαισίου δομική περιήγηση και αναζήτηση, στη συνέχεια, τη διαχειριζόμενη περιήγηση είναι μια πολύ καλή επιλογή. Η επιλογή διαχειριζόμενη περιήγηση μπορεί να διατηρηθεί μέσω ρύθμιση παραμέτρων, δεν περιλαμβάνει αρχεία προσαρμογής κώδικα και είναι σημαντικά ταχύτερο από την δομική περιήγηση εκτός του πλαισίου.

Μια άλλη προσέγγιση είναι η αναδιάρθρωση την υπάρχουσα τοποθεσία και να μειώσετε τον αριθμό των στοιχείων περιήγησης και δευτερεύουσες τοποθεσίες που απαιτούνται. Αυτό συμβαίνει επειδή δομική περιήγηση εκτελεί επίσης και με την προϋπόθεση ότι δεν είναι πολύ περίπλοκο της δομής τοποθεσίας και περιήγησης.

Σε αυτό το άρθρο συγκρίνει τις διάφορες μεθόδους σε μια συλλογή τοποθεσιών παράδειγμα. Η συλλογή τοποθεσιών παράδειγμα έχει 11 δευτερεύουσες τοποθεσίες και κάθε δευτερεύουσα τοποθεσία έχει τουλάχιστον τέσσερις πρόσθετες δευτερεύουσες τοποθεσίες.

Στιγμιότυπο οθόνης που εμφανίζει τοποθεσίες και δευτερεύουσες τοποθεσίες

Χρήση δομική περιήγηση στο SharePoint Online

Αυτή είναι η περιήγηση εκτός του πλαισίου που χρησιμοποιείται από προεπιλογή και είναι η πιο απλές και κατάλληλη λύση στις περισσότερες περιπτώσεις. Εκτός εάν υπάρχει πολύπλοκη δομή πολλές δευτερεύουσες τοποθεσίες ή πολλά επίπεδα δευτερευουσών τοποθεσιών, δομική περιήγηση εκτελεί σωστά. Τα βασικά πλεονεκτήματα αυτής της προσέγγισης είναι ότι έχει περικοπεί ασφαλείας, ενημερώνεται αυτόματα όταν προστίθενται οι νέες τοποθεσίες και δεν απαιτεί οποιαδήποτε προσαρμογή της κύριας σελίδας. Μη τεχνικές χρήστη να επίσης εύκολα Προσθήκη στοιχείων απόκρυψη των στοιχείων και διαχείριση της περιήγησης από τη σελίδα "Ρυθμίσεις".

Ενεργοποίηση δομική περιήγηση στο SharePoint Online

Για την απεικόνιση πώς οι επιδόσεις σε μια τυπική λύση του SharePoint Online με δομική περιήγηση και εμφάνιση δευτερεύουσες τοποθεσίες την επιλογή ενεργοποιημένη. Τα παρακάτω είναι ένα στιγμιότυπο οθόνης ρυθμίσεων που βρίσκεται στη σελίδα Ρυθμίσεις τοποθεσίας > Περιήγηση.

Στιγμιότυπο οθόνης που εμφανίζει τις δευτερεύουσες τοποθεσίες

Ανάλυση απόδοσης δομική περιήγηση στο SharePoint Online

Για να αναλύσετε τις επιδόσεις της σελίδας του SharePoint, χρησιμοποιήστε την καρτέλα δικτύου από τα εργαλεία για προγραμματιστές F12 στον Internet Explorer.

Στιγμιότυπο οθόνης που εμφανίζει την καρτέλα "Δίκτυο" των εργαλείων προγραμματισμού F12

Στην καρτέλα " δίκτυο ", κάντε κλικ στη σελίδα .aspx που φορτώνεται και, στη συνέχεια, κάντε κλικ στην καρτέλα Λεπτομέρειες.

Στιγμιότυπο οθόνης που εμφανίζει την καρτέλα λεπτομερειών

Κάντε κλικ στην επιλογή Κεφαλίδες απόκρισης.

Στιγμιότυπο της καρτέλας "Λεπτομέρειες"

SharePoint επιστρέφει ορισμένες χρήσιμες πληροφορίες διαγνωστικών τις κεφαλίδες απόκρισης. Ένα από τα πιο χρήσιμες είναι SPRequestDuration    , η οποία είναι η τιμή, σε χιλιοστά του δευτερολέπτου από τη διάρκεια αίτησης εκτελέσατε για να διεργασία στο διακομιστή.

Στην παρακάτω οθόνη στιγμιότυπο Εμφάνιση δευτερευουσών τοποθεσιών είναι επιλεγμένο το πλαίσιο για τη δομική περιήγηση. Αυτό σημαίνει ότι υπάρχει μόνο τη σύνδεση της συλλογής τοποθεσιών στην καθολική περιήγηση του:

Στιγμιότυπο οθόνης που εμφανίζει τους χρόνους φόρτωσης ως διάρκεια αίτησης

Το κλειδί SPRequestDuration    έχει μια τιμή 245 χιλιοστά του δευτερολέπτου. Αυτό αντιπροσωπεύει την ώρα που χρειάστηκαν για να επιστρέψετε στην πρόσκληση. Επειδή υπάρχει μόνο ένα στοιχείο περιήγησης στην τοποθεσία, αυτό είναι ένα καλό σημείο αναφοράς για τον τρόπο του SharePoint Online που πραγματοποιεί χωρίς έντονη περιήγησης. Το επόμενο στιγμιότυπο οθόνης εμφανίζει Προσθήκη στις δευτερεύουσες τοποθεσίες πώς επηρεάζει αυτό το κλειδί.

Στιγμιότυπο οθόνης που εμφανίζει τη διάρκεια αίτησης 2502 ms

Προσθήκη τις δευτερεύουσες τοποθεσίες που έχει αυξηθεί σημαντικά το χρόνο που χρειάζεται για να επιστρέψει την αίτηση σελίδας.

Τα πλεονεκτήματα της χρήσης κανονική δομημένες περιήγησης είναι ότι μπορείτε να εύκολα οργάνωση της σειράς, απόκρυψη τοποθεσίες, να προσθέσετε σελίδες, τα αποτελέσματα είναι περικοπές ασφαλείας, και δεν απόκλισης από τις υποστηριζόμενες κύριες σελίδες που χρησιμοποιούνται στο SharePoint Online. Εάν που δομή προσεκτικά την τοποθεσία σας και να ελαχιστοποιήσετε την ποσότητα των δευτερευουσών τοποθεσιών στη συλλογή τοποθεσιών σας, στη συνέχεια, δομική περιήγηση εκτελεί σωστά.

Χρήση διαχειριζόμενη περιήγηση και διαχειριζόμενων μετα-δεδομένων στο SharePoint Online

Διαχειριζόμενη περιήγηση είναι μια άλλη επιλογή εκτός του πλαισίου που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε ξανά το ίδιο είδος λειτουργικότητα με δομική περιήγηση.

Το πλεονέκτημα της χρήσης διαχειριζόμενων μετα-δεδομένων είναι ότι είναι πολύ πιο γρήγορα για να ανακτήσετε τα δεδομένα από τη χρήση περιεχομένου από ερώτημα για να δημιουργήσετε την περιήγηση στην τοποθεσία. Παρόλο που είναι πολύ πιο γρήγορα δεν υπάρχει τρόπος να ασφαλείας trim τα αποτελέσματα επομένως, αν ένας χρήστης δεν έχει πρόσβαση σε μια συγκεκριμένη τοποθεσία, τη σύνδεση θα εξακολουθούν να εμφανίζουν, αλλά θα οδηγήσει σε ένα μήνυμα σφάλματος.

Πώς μπορείτε να υλοποιήσετε διαχειριζόμενη περιήγηση και τα αποτελέσματα   

Υπάρχουν πολλά άρθρα στο TechNet σχετικά με τις λεπτομέρειες της διαχειριζόμενη περιήγηση, για παράδειγμα, ανατρέξτε στο θέμα Επισκόπηση διαχειριζόμενη περιήγηση στον SharePoint Server 2013.

Για να υλοποιήσετε διαχειριζόμενη περιήγηση, πρέπει να έχετε όρων αποθήκευση δικαιώματα διαχειριστή. Με τη ρύθμιση όρων με διευθύνσεις URL που ταιριάζει με τη δομή μιας συλλογής τοποθεσιών, διαχειριζόμενη περιήγηση μπορεί να χρησιμοποιηθεί για να αντικαταστήσετε δομική περιήγηση. Για παράδειγμα:

Στιγμιότυπο οθόνης του παραδείγματος Δευτερεύουσα τοποθεσία1

Το παρακάτω παράδειγμα εμφανίζει τις επιδόσεις της σύνθετες περιήγησης χρησιμοποιώντας διαχειριζόμενη περιήγηση.

Στιγμιότυπο οθόνης του παραδείγματος SPRequestDuration

Χρήση διαχειριζόμενη περιήγηση με συνέπεια βελτιώνει τις επιδόσεις σε σύγκριση με το περιεχόμενο κατά προσέγγιση δομική περιήγηση ερωτήματος.

Χρήση βάσει αναζήτησης δέσμες ενεργειών πελάτη

Χρήση της αναζήτησης, μπορείτε να αξιοποιήσετε τα ευρετήρια που δημιουργούνται στο παρασκήνιο χρησιμοποιώντας Συνεχής ανίχνευση. Αυτό σημαίνει ότι δεν υπάρχουν έντονη ερωτήματα περιεχομένου. Τα αποτελέσματα της αναζήτησης λαμβάνονται από το ευρετήριο αναζήτησης και τα αποτελέσματα είναι περικοπές ασφαλείας. Αυτό είναι ταχύτερο από χρησιμοποιώντας κανονική ερωτήματα περιεχομένου. Με χρήση της αναζήτησης για δομική περιήγηση, ειδικά εάν έχετε μια δομή σύνθετες τοποθεσίας, θα επιταχύνει σελίδα σημαντικά τη φόρτωση ώρα. Το βασικό πλεονέκτημα της παρούσας μέσω διαχειριζόμενη περιήγηση είναι ότι μπορείτε να επωφεληθείτε από αποκοπή ασφαλείας.

Αυτή η προσέγγιση περιλαμβάνει τη δημιουργία μιας προσαρμοσμένης κύριας σελίδας και αντικαθιστώντας τον κώδικα περιήγησης εκτός του πλαισίου με προσαρμοσμένη HTML. Ακολουθήστε αυτήν τη διαδικασία για να αντικαταστήσετε τον κωδικό περιήγησης στο seattle.html το αρχείο.

Σε αυτό το παράδειγμα, θα ανοίξει το αρχείο seattle.html και αντικαταστήστε το στοιχείο ολόκληρο αναγνωριστικό = "DeltaTopNavigation" με του προσαρμοσμένου κώδικα HTML.

Παράδειγμα: Για να αντικαταστήσετε τον κωδικό εκτός του πλαισίου περιήγησης σε μια κύρια σελίδα

  1. Μεταβείτε στη σελίδα Ρυθμίσεις τοποθεσίας.

  2. Ανοίξτε τη συλλογή κύριων σελίδων, κάνοντας κλικ στην επιλογή Κύριες σελίδες.

  3. Από εδώ, μπορείτε να περιηγηθείτε στη βιβλιοθήκη και να κάνετε λήψη του αρχείου seattle.master.

  4. Επεξεργαστείτε τον κώδικα χρησιμοποιώντας ένα πρόγραμμα επεξεργασίας κειμένου και να διαγράψετε το μπλοκ κώδικα στο παρακάτω στιγμιότυπο οθόνης.

    Στιγμιότυπο οθόνης του κωδικού DeltaTopNavigation για διαγραφή
  5. Κατάργηση του κωδικού μεταξύ του < SharePoint:AjaxDelta αναγνωριστικό = "DeltaTopNavigation" > και < \SharePoint:AjaxDelta > των ετικετών και να το αντικαταστήσετε με το παρακάτω τμήμα κώδικα:

    <div id="loading">
      <!--Replace with path to loading image.-->
      <div style="background-image: url(''); height: 22px; width: 22px; ">
      </div>
    </div>
    <!-- Main Content-->
    <div id="navContainer" style="display:none">
        <div data-bind="foreach: hierarchy" class="noindex ms-core-listMenu-horizontalBox">
            <a class="dynamic menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
                <span class="menu-item-text" data-bind="text: item.Title">
                </span>
            </a>
            <ul id="menu" data-bind="foreach: $data.children" style="padding-left:20px">
                <li class="static dynamic-children level1">
                    <a class="static dynamic-children menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
                   
                     <!-- ko if: children.length > 0-->
                        <span aria-haspopup="true" class="additional-background ms-navedit-flyoutArrow dynamic-children">
                            <span class="menu-item-text" data-bind="text: item.Title">
                            </span>
                        </span>
                    <!-- /ko -->
                    <!-- ko if: children.length == 0-->   
                        <span aria-haspopup="true" class="ms-navedit-flyoutArrow dynamic-children">
                            <span class="menu-item-text" data-bind="text: item.Title">
                            </span>
                        </span>
                    <!-- /ko -->   
                    </a>
                   
                    <!-- ko if: children.length > 0-->                                                       
                    <ul id="menu"  data-bind="foreach: children;" class="dynamic  level2" >
                        <li class="dynamic level2">
                            <a class="dynamic menu-item ms-core-listMenu-item ms-displayInline  ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
             
              <!-- ko if: children.length > 0-->
              <span aria-haspopup="true" class="additional-background ms-navedit-flyoutArrow dynamic-children">
               <span class="menu-item-text" data-bind="text: item.Title">
               </span>
              </span>
               <!-- /ko -->
              <!-- ko if: children.length == 0-->
              <span aria-haspopup="true" class="ms-navedit-flyoutArrow dynamic-children">
               <span class="menu-item-text" data-bind="text: item.Title">
               </span>
              </span>                 
              <!-- /ko -->   
                            </a>
              <!-- ko if: children.length > 0-->
             <ul id="menu" data-bind="foreach: children;" class="dynamic level3" >
              <li class="dynamic level3">
               <a class="dynamic menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
                <span class="menu-item-text" data-bind="text: item.Title">
                </span>
               </a>
              </li>
             </ul>
               <!-- /ko -->
                        </li>
                    </ul>
                    <!-- /ko -->
                </li>
            </ul>
        </div>
    </div>
  6. Αντικατάσταση της διεύθυνσης URL στο τη φόρτωση εικόνα ετικέτα αγκύρωσης στην αρχή, με μια σύνδεση προς μια εικόνα φόρτωσης στη συλλογή τοποθεσιών σας. Αφού κάνετε τις αλλαγές, μετονομάστε το αρχείο και, στη συνέχεια, στείλτε το στο στη συλλογή κύριων σελίδων. Αυτό δημιουργεί ένα νέο αρχείο .master.

  7. Ο κώδικας HTML είναι το βασικό σήμανσης που θα συμπληρώνεται από τα αποτελέσματα αναζήτησης που επιστρέφονται από κώδικα JavaScript. Θα πρέπει να επεξεργαστείτε τον παρακάτω κώδικα για να αλλάξετε την τιμή για το var root = “site collection URL , όπως φαίνεται στο το παρακάτω τμήμα κώδικα:

    var root = “https://spperformance.sharepoint.com/sites/NavigationBySearch”;

    Ολόκληρο το αρχείο JavaScript είναι ως εξής:

    //Models and Namespaces
    var SPOCustom = SPOCustom || {};
    SPOCustom.Models = SPOCustom.Models || {}
    SPOCustom.Models.NavigationNode = function () {
    
        this.Url = ko.observable("");
        this.Title = ko.observable("");
        this.Parent = ko.observable("");
    
    };
    
    var root = "https://spperformance.sharepoint.com/sites/NavigationBySearch";
    var baseUrl = root + "/_api/search/query?querytext=";
    var query = baseUrl + "'contentClass=\"STS_Web\"+path:" + root + "'&trimduplicates=false&rowlimit=300";
    
    var baseRequest = {
        url: "",
        type: ""
    };
    
    
    //Parses a local object from JSON search result.
    function getNavigationFromDto(dto) {
        var item = new SPOCustom.Models.NavigationNode();
        if (dto != undefined) {
    
            var webTemplate = getSearchResultsValue(dto.Cells.results, 'WebTemplate');
    
            if (webTemplate != "APP") {
                item.Title(getSearchResultsValue(dto.Cells.results, 'Title')); //Key = Title
                item.Url(getSearchResultsValue(dto.Cells.results, 'Path')); //Key = Path
                item.Parent(getSearchResultsValue(dto.Cells.results, 'ParentLink')); //Key = ParentLink
            }
    
        }
        return item;
    }
    
    function getSearchResultsValue(results, key) {
    
        for (i = 0; i < results.length; i++) {
            if (results[i].Key == key) {
                return results[i].Value;
            }
        }
        return null;
    }
    
    //Parse a local object from the serialized cache.
    function getNavigationFromCache(dto) {
        var item = new SPOCustom.Models.NavigationNode();
    
        if (dto != undefined) {
    
            item.Title(dto.Title);
            item.Url(dto.Url);
            item.Parent(dto.Parent);
        }
    
        return item;
    }
    
    /* create a new OData request for JSON response */
    function getRequest(endpoint) {
        var request = baseRequest;
        request.type = "GET";
        request.url = endpoint;
        request.headers = { ACCEPT: "application/json;odata=verbose" };
        return request;
    };
    
    /* Navigation Module*/
    function NavigationViewModel() {
        "use strict";
        var self = this;
        self.nodes = ko.observableArray([]);
        self.hierarchy = ko.observableArray([]);;
        self.loadNavigatioNodes = function () {
            //Check local storage for cached navigation datasource.
            var fromStorage = localStorage["nodesCache"];
            if (false) {
                var cachedNodes = JSON.parse(localStorage["nodesCache"]);
    
                if (cachedNodes && timeStamp) {
                    //Check for cache expiration. Currently set to 3 hrs.
                    var now = new Date();
                    var diff = now.getTime() - timeStamp;
                    if (Math.round(diff / (1000 * 60 * 60)) < 3) {
    
                        //return from cache.
                        var cacheResults = [];
                        $.each(cachedNodes, function (i, item) {
                            var nodeitem = getNavigationFromCache(item, true);
                            cacheResults.push(nodeitem);
                        });
    
                        self.buildHierarchy(cacheResults);
                        self.toggleView();
                        addEventsToElements();
                        return;
                    }
                }
            }
            //No cache hit, REST call required.
            self.queryRemoteInterface();
        };
    
        //Executes a REST call and builds the navigation hierarchy.
        self.queryRemoteInterface = function () {
            var oDataRequest = getRequest(query);
            $.ajax(oDataRequest).done(function (data) {
                var results = [];
                $.each(data.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results, function (i, item) {
    
                    if (i == 0) {
                        //Add root element.
                        var rootItem = new SPOCustom.Models.NavigationNode();
                        rootItem.Title("Root");
                        rootItem.Url(root);
                        rootItem.Parent(null);
                        results.push(rootItem);
                    }
                    var navItem = getNavigationFromDto(item);
                    results.push(navItem);
                });
                //Add to local cache
                localStorage["nodesCache"] = ko.toJSON(results);
    
                localStorage["nodesCachedAt"] = new Date().getTime();
                self.nodes(results);
                if (self.nodes().length > 0) {
                    var unsortedArray = self.nodes();
                    var sortedArray = unsortedArray.sort(self.sortObjectsInArray);
    
                    self.buildHierarchy(sortedArray);
                    self.toggleView();
                    addEventsToElements();
                }
            }).fail(function () {
                //Handle error here!!
                $("#loading").hide();
                $("#error").show();
            });
        };
        self.toggleView = function () {
            var navContainer = document.getElementById("navContainer");
            ko.applyBindings(self, navContainer);
            $("#loading").hide();
            $("#navContainer").show();
    
        };
        //Uses linq.js to build the navigation tree.
        self.buildHierarchy = function (enumerable) {
            self.hierarchy(Enumerable.From(enumerable).ByHierarchy(function (d) {
                return d.Parent() == null;
            }, function (parent, child) {
                if (parent.Url() == null || child.Parent() == null)
                    return false;
                return parent.Url().toUpperCase() == child.Parent().toUpperCase();
            }).ToArray());
    
            self.sortChildren(self.hierarchy()[0]);
        };
    
    
        self.sortChildren = function (parent) {
    
            // sjip processing if no children
            if (!parent || !parent.children || parent.children.length === 0) {
                return;
            }
    
            parent.children = parent.children.sort(self.sortObjectsInArray2);
    
            for (var i = 0; i < parent.children.length; i++) {
                var elem = parent.children[i];
    
                if (elem.children && elem.children.length > 0) {
                    self.sortChildren(elem);
                }
            }
        };
    
        // ByHierarchy method breaks the sorting in chrome and firefix 
        // we need to resort  as ascending
        self.sortObjectsInArray2 = function (a, b) {
            if (a.item.Title() > b.item.Title())
                return 1;
            if (a.item.Title() < b.item.Title())
                return -1;
            return 0;
        };
    
    
        self.sortObjectsInArray = function (a, b) {
            if (a.Title() > b.Title())
                return -1;
            if (a.Title() < b.Title())
                return 1;
            return 0;
        }
    }
    
    //Loads the navigation on load and binds the event handlers for mouse interaction.
    function InitCustomNav() {
        var viewModel = new NavigationViewModel();
        viewModel.loadNavigatioNodes();
    }
    
    function addEventsToElements() {
        //events.
    

    $("li.level1") .mouseover(function () {
              θέση VAR = $(this).position();
              .find("ul.level2").css $(αυτό) ({πλάτος: 100, αριστερά: position.left + 10, από επάνω: 50});

    })
       .mouseout(Function () {
         .find("ul.level2").css $(αυτό) ({αριστερό:-99999, επάνω: 0});

        });

         $("li.level2") .mouseover(function () {
              θέση VAR = $(this).position();
              Console.log(JSON.stringify(position));
              .find("ul.level3").css $(αυτό) ({πλάτος: 100, αριστερά: position.left + 95, από επάνω: position.top});        

    })
       .mouseout(Function () {
         .find("ul.level3").css $(αυτό) ({αριστερό:-99999, επάνω: 0});
        });

    } _spBodyOnLoadFunctionNames.push("InitCustomNav");

    Για να συνοψίσετε τον κώδικα που φαίνεται παραπάνω στη συνάρτηση $(document).ready jQuery υπάρχει ένα αντικείμενο viewModel που δημιουργήσατε και, στη συνέχεια, το loadNavigationNodes() λειτουργούν σε αυτό το αντικείμενο είναι η οποία ονομάζεται. Αυτή η συνάρτηση φορτώνει είτε ιεραρχία περιήγησης έχει δημιουργηθεί ήδη αποθηκευμένο σε HTML5 τοπικό χώρο αποθήκευσης του προγράμματος περιήγησης του υπολογιστή-πελάτη ή καλεί τη συνάρτηση queryRemoteInterface().

    QueryRemoteInterface() δημιουργεί μια αίτηση με χρήση της συνάρτησης getRequest() με την παράμετρο ερωτήματος που ορίζονται από προηγούμενη έκδοση στη δέσμη ενεργειών και, στη συνέχεια, επιστρέφει δεδομένα από το διακομιστή. Αυτά τα δεδομένα είναι ουσιαστικά ένας πίνακας με όλες τις τοποθεσίες της συλλογής τοποθεσιών με αντικείμενα μεταφορά δεδομένων με τις διάφορες ιδιότητες. Αυτά τα δεδομένα, στη συνέχεια, αναλύεται σε τα αντικείμενα παλιότερα καθορισμένη SPO.Models.NavigationNode που χρησιμοποιούν Knockout.js για να δημιουργήσετε παρατηρήσιμα ιδιότητες για χρήση από δεδομένα σύνδεσης τις τιμές στην HTML που ορίσαμε νωρίτερα. Τα αντικείμενα, στη συνέχεια, τοποθετούνται σε έναν πίνακα αποτελεσμάτων. Αυτός ο πίνακας είναι αναλυθεί σε JSON χρησιμοποιώντας απώθησης και είναι αποθηκευμένα στο χώρο αποθήκευσης της τοπικό πρόγραμμα περιήγησης για βελτιωμένες επιδόσεις σε φορτώσεις σελίδων μελλοντική.

  8. Στη συνέχεια, τα αποτελέσματα που έχουν εκχωρηθεί σε έναν πίνακα self.nodes και μια ιεραρχία που δημιουργείται από τα αντικείμενα με χρήση linq.js εκχώρηση το αποτέλεσμα σε ένα πίνακα self.heirarchy. Αυτός ο πίνακας είναι το αντικείμενο που είναι δεσμευμένο με την HTML. Αυτό γίνεται στη συνάρτηση toggleView() , μεταφέροντας το αντικείμενο αυτόματης στη συνάρτηση ko.applyBinding() . Αυτό, στη συνέχεια, έχει ως αποτέλεσμα την ιεραρχία πίνακα, είναι συνδεδεμένο με τον παρακάτω κώδικα HTML:

    <div data-bind=”foreach: hierarchy” class=”noindex ms-core-listMenu-horizontalBox”>

    Τέλος, τα προγράμματα χειρισμού συμβάντων για mouseenter και mouseexit προστίθενται στην περιήγηση ανώτατου επιπέδου για το χειρισμό αναπτυσσόμενα μενού τη δευτερεύουσα τοποθεσία η οποία γίνεται στη συνάρτηση addEventsToElements() .

    Τα αποτελέσματα της περιήγησης μπορούν να προβληθούν στο παρακάτω στιγμιότυπο οθόνης:

    Στιγμιότυπο οθόνης των αποτελεσμάτων περιήγησης

    Στο παράδειγμά μας σύνθετες περιήγησης μια νέα σελίδα έχει έχουν αποκοπή φόρτωσης χωρίς την τοπική σε cache εμφανίζει το χρόνο που αναλώνεται σε διακομιστή προς τα κάτω από την συγκριτικών δομική περιήγηση για να λάβετε ένα παρόμοιο αποτέλεσμα ως η προσέγγιση διαχειριζόμενη περιήγηση.

    Στιγμιότυπο οθόνης του SPRequestDuration 301

    Ένα από τα κύρια οφέλη αυτής της προσέγγισης είναι ότι με χρήση του τοπικού χώρου αποθήκευσης HTML5, την περιήγηση αποθηκεύονται τοπικά για το χρήστη την επόμενη φορά που τους φόρτωση της σελίδας.

Λαμβάνουμε βελτιώσεις απόδοσης κύρια από με χρήση του API τα αποτελέσματα της αναζήτησης για δομική περιήγηση; Ωστόσο, χρειάζονται ορισμένες τεχνική ικανότητα πρέπει να εκτελούνται και προσαρμογή αυτή η λειτουργία. Κατά την εκτέλεση παράδειγμα, τις τοποθεσίες ταξινομούνται με τον ίδιο τρόπο ως εκτός του πλαισίου δομική περιήγηση; αλφαβητική σειρά. Εάν θέλατε να αποκλίνει από αυτήν τη σειρά, θα είναι πιο σύνθετη για να αναπτύξετε και να διατηρήσετε. Επίσης, αυτή η προσέγγιση απαιτεί να αποκλίνει από τις υποστηριζόμενες κύριες σελίδες. Εάν δεν διατηρείται η προσαρμοσμένη κύρια σελίδα, τοποθεσία σας θα χάσετε out καθεξής ενημερώσεις και βελτιώσεις που το κάνει Microsoft στις κύριες σελίδες.

Ο παραπάνω κώδικας περιλαμβάνει τις ακόλουθες εξαρτήσεις:

Η τρέχουσα έκδοση του LinqJS δεν περιέχει τη μέθοδο ByHierarchy που χρησιμοποιείται στον παραπάνω κώδικα και θα διακόψει τον κώδικα περιήγησης. Για να διορθώσετε αυτό το πρόβλημα, προσθέστε την ακόλουθη μέθοδο στο αρχείο Linq.js πριν από τη γραμμή "Flatten: συνάρτηση ()".

ByHierarchy: function(firstLevel, connectBy, orderBy, ascending, parent) {
     ascending = ascending == undefined ? true : ascending;
     var orderMethod = ascending == true ? 'OrderBy' : 'OrderByDescending';
     var source = this;
     firstLevel = Utils.CreateLambda(firstLevel);
     connectBy = Utils.CreateLambda(connectBy);
     orderBy = Utils.CreateLambda(orderBy);
    
     //Initiate or increase level
     var level = parent === undefined ? 1 : parent.level + 1;

    return new Enumerable(function() {
         var enumerator;
         var index = 0;

        var createLevel = function() {
                 var obj = {
                     item: enumerator.Current(),
                     level : level
                 };
                 obj.children = Enumerable.From(source).ByHierarchy(firstLevel, connectBy, orderBy, ascending, obj);
                 if (orderBy !== undefined) {
                     obj.children = obj.children[orderMethod](function(d) {
                         return orderBy(d.item); //unwrap the actual item for sort to work
                     });
                 }
                 obj.children = obj.children.ToArray();
                 Enumerable.From(obj.children).ForEach(function(child) {
                     child.getParent = function() {
                         return obj;
                     };
                 });
                 return obj;
             };

        return new IEnumerator(

        function() {
             enumerator = source.GetEnumerator();
         }, function() {
             while (enumerator.MoveNext()) {
                 var returnArr;
                 if (!parent) {
                     if (firstLevel(enumerator.Current(), index++)) {
                         return this.Yield(createLevel());
                     }

                } else {
                     if (connectBy(parent.item, enumerator.Current(), index++)) {
                         return this.Yield(createLevel());
                     }
                 }
             }
             return false;
         }, function() {
             Utils.Dispose(enumerator);
         })
     });
 },
Αναπτύξτε τις δεξιότητές σας στο Office
Εξερευνήστε το περιεχόμενο της εκπαίδευσης
Αποκτήστε πρώτοι τις νέες δυνατότητες
Γίνετε μέλος του Office Insider

Σας βοήθησαν αυτές οι πληροφορίες;

Σας ευχαριστούμε για τα σχόλιά σας!

Σας ευχαριστούμε για τα σχόλιά σας! Φαίνεται ότι μπορεί να είναι χρήσιμο να συνδεθείτε με έναν από τους συνεργάτες υποστήριξης του Office.

×